Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python对二进制文件/字符串进行正则表达式编辑_Python_Regex_Hex - Fatal编程技术网

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

使用python对二进制文件/字符串进行正则表达式编辑,python,regex,hex,Python,Regex,Hex,我正在寻找一种在二进制文件上使用正则表达式在Python2.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(

我正在寻找一种在二进制文件上使用正则表达式在Python2.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) 
现在,虽然我没有出错,但我的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,以便将其存储到文件中

r'
文字前缀使所有斜杠按字面解释,即,
r'\x00'
不是单个零字节,而是4个字符

为了避免将随机字节解释为正则表达式元字符,可以使用

为了避免重复替换字符串中的前缀、后缀,可以使用正则表达式“lookahead,lookahead:

>>> 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'
>>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')(?谢谢,我试过了,但仍然是一样的IMO:>>>f99=re.sub(b'\x03\x00\x00\xF0',b'\x03\x00\x00\x01\x4B\x4B\x4B\x4B\x4B\x07\x00\xF0',s)>>打印f99[0]M>>f01=re.findall(br'\x03\x00\x00\x00\x00\x00\x00',s)>>JP CRUNCH 2 EQHi Sebastian,谢谢你的回答,这对我来说很复杂。我需要尝试一下并记录下我自己。不管怎样,感谢这个“神奇公式”,它似乎能像我一样工作intend@Waraba:您还可以将正则表达式生成为:
br'(?@J.F.Sebastian:这是一种特殊性(更可能是一种疏忽)原始替换字符串中的其他转义由re模块转换(例如,
\t
是),但
\x
转义不是。