[英]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-9
和AZ
的單個字符 {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.