我正在寻找一种在python 2.7中使用正则表达式在二进制文件上进行字符串替换的方法。
s是我从阅读二进制文件中获得的字符串。它包含此序列(十六进制):
<00>'00 00 03 00 00 01 4A 50 20 43 52 55 4E 43 48 20 32 20 45 51 00 F7 00 F0 '这是我用来查找字符串sub:
的变量f01 = re.findall( br'\x03\x00\x00\x01(.*?)\xF7\x00\xF0', s)
这是我的潜艇:
f99 = re.sub( br'\x03\x00\x00\x01(.*?)\xF7\x00\xF0', br'\x03\x00\x00\x01\x4B\x4B\x4B\x4B\xF7\x00\xF0', s)
现在,虽然我没有错误,但我的sub似乎没有改变我的字符串。我错过了什么吗?
>>> f01 = re.findall( br'\x03\x00\x00\x01(.*?)\xF7\x00\xF0', s)
>>> print f01[0]
JP CRUNCH 2 EQ
>>> f99 = re.sub( br'\x03\x00\x00\x01(.*?)\xF7\x00\xF0', br'\x03\x00\x00\x01\x4B\x4B\x4B\x4B\xF7\x00\xF0', s)
>>> print f99
MThd
>>> print f99[0]
M
>>> print f01[0]
JP CRUNCH 2 EQ
>>> f01 = re.findall( br'\x03\x00\x00\x01(.*?)\xF7\x00\xF0', s)
>>> print f01[0]
JP CRUNCH 2 EQ
我想将我的初始字符串更改为\ x03 \ x00 \ x00 \ x01 \ x4B \ x4B \ x4B \ x4B \ xF7 \ x00 \ xF0,以便将其存储到文件中。
答案 0 :(得分:2)
r''
文字前缀使得所有斜杠都按字面解释,即r'\x00'
不是单个零字节而是4个字符。
为避免将随机字节解释为正则表达式元字符,您可以使用re.escape
function。
为避免重复前缀,替换字符串中的后缀可以使用正则表达式'lookahead,lookbehind:
>>> s
'\x00\x00\x03\x00\x00\x01JP CRUNCH 2 EQ\x00\xf7\x00\xf0'
>>> pre = b'\x03\x00\x00\x01'
>>> suff = b'\xf7\x00\xf0'
>>> re.sub(br'(?<=%s).*?(?=%s)' % tuple(map(re.escape, [pre, suff])), b'\x4b'*4, s)
'\x00\x00\x03\x00\x00\x01KKKK\xf7\x00\xf0'
您可能需要re.DOTALL
正则表达式标记来强制.
也匹配换行符。