簡體   English   中英

匹配除模式之外的所有內容並替換匹配的字符串

[英]Match everything except a pattern and replace matched with string

我想使用python來操作我擁有的字符串。
基本上,我想在每個十六進制字節之前加上“\\ x”,除了已經有“\\ x”前綴的字節。

我的原始字符串如下所示:

mystr = r"30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00"

我想從中創建以下字符串:

mystr = r"\x30\x33\x62\x37\x61\x31\x31\x90\x01\x0A\x90\x02\x14\x6F\x6D\x6D\x61\x6E\x64\x90\x01\x06\x90\x02\x0F\x52\x65\x6C\x61\x74\x90\x01\x02\x90\x02\x50\x65\x6D\x31\x90\x00"

我想使用正則表達式來匹配除/\\x../g之外的所有內容,並用“\\ x”替換每個匹配項。 可悲的是,我在沒有任何成功的情況下苦苦掙扎。 而且,我不確定使用正則表達式是解決此類案例的最佳方法。

正則表達式(?:\\\\x)?([0-9A-Z]{2}) 替換\\\\x$1

細節

  • (?:)非捕獲組
  • ? 匹配0到1之間的匹配,匹配字符串\\x如果存在)。
  • ()捕獲小組
  • []匹配列表0-9AZ的單個字符
  • {n}完全匹配n
  • \\\\x String \\ x
  • $1組。

Python代碼

import re

text = R'30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00'
text = re.sub(R'(?:\\x)?([0-9A-Z]{2})', R'\\x\1', text)
print(text)

輸出

\x30\x33\x62\x37\x61\x31\x31\x90\x01\x0A\x90\x02\x14\x6F\x6D\x6D\x61\x6E\x64\x90\x01\x06\x90\x02\x0F\x52\x65\x6C\x61\x74\x90\x01\x02\x90\x02\x50\x65\x6D\x31\x90\x00

代碼演示

你不需要正則表達式。 您可以使用簡單的字符串操作。 首先從字符串中刪除所有"\\x" 然后添加每2個字符添加一次。

replaced = mystr.replace(r"\x", "")
newstr = "".join([r"\x" + replaced[i*2:(i+1)*2] for i in range(len(replaced)/2)])

輸出:

>>> print(newstr)
\x30\x33\x62\x37\x61\x31\x31\x90\x01\x0A\x90\x02\x14\x6F\x6D\x6D\x61\x6E\x64\x90\x01\x06\x90\x02\x0F\x52\x65\x6C\x61\x74\x90\x01\x02\x90\x02\x50\x65\x6D\x31\x90\x00

您可以獲得一個包含值的列表,以便按照您的意願進行操作,並使用更簡單的重新模式

mystr = r"30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00"

import re

pat = r'([a-fA-F0-9]{2})'
match = re.findall(pat, mystr)

if match:
    print('\n\nNew string:')
    print('\\x' + '\\x'.join(match))
    #for elem in match: # match gives you a list of strings with the hex values
    #    print('\\x{}'.format(elem), end='')

print('\n\nOriginal string:')
print(mystr)

這可以在不使用正向外觀和負向前瞻的組合替換現有\\x的情況下完成。

(?!(?<=\\x)|(?<=\\x[a-f\d]))([a-f\d]{2})

用法

請參閱此處使用的代碼

import re

regex = r"(?!(?<=\\x)|(?<=\\x[a-f\d]))([a-f\d]{2})"
test_str = r"30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00"
subst = r"\\x$1"

result = re.sub(regex, subst, test_str, 0, re.IGNORECASE)

if result:
    print (result)

說明

  • (?!(?<=\\\\x)|(?<=\\\\x[af\\d]))否定先行,確保以下任何一項不匹配。
    • (?<=\\\\x)確保前面的正面后視是\\x
    • (?<=\\\\x[af\\d])確定前面的正后觀是\\x后跟一個十六進制數字。
  • ([af\\d]{2})任意兩個十六進制數字捕獲到捕獲組1中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM