正则表达式使用python编辑二进制文件/字符串

时间:2012-07-18 09:46:55

标签: python regex hex

我正在寻找一种在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,以便将其存储到文件中。

1 个答案:

答案 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正则表达式标记来强制.也匹配换行符。