我正在寻找一种在 python 2.7 中使用正则表达式对二进制文件进行字符串替换的方法。
s 是我从读取二进制文件中获得的字符串。它包含以下序列(十六进制):
'00 0003 00 00 014A 50 20 43 52 55 4E 43 48 20 32 20 45 51 00F7 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)
现在,虽然我没有收到错误,但我的子程序似乎没有更改我的字符串。我错过了什么吗?
>>> 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 以便我可以将其存储到文件中。
最佳答案
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
正则表达式标志来强制 .
也匹配换行符。
关于python - 使用 python 正则表达式编辑二进制文件/字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11538613/