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

标签 python regex hex

我正在寻找一种在 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/

相关文章:

Java RegEx转义重复的单引号

python - 类型错误 : Odd-length string when decoding hex string

python - 使用 scrapy 递归抓取网站

python - 在 ROS 之外使用 ROS 消息类

python - 如何在 ipython 中显示对象的对象

Javascript - 如何获得 2 种 HEX 颜色之间的 HEX 颜色渐变列表?

c# - 如何将十六进制字符串转换为字节数组?

python - 删除 Pandas 中重复 NaN 值超过阈值的行

c++ - boost 正则表达式混淆

_ 分隔字符串上的 JAVA 正则表达式