2

バイナリファイルで正規表現を使用してPython 2.7で文字列置換を行う方法を探しています。

s は、バイナリ ファイルを読み取って取得した文字列です。次のシーケンス (hex ) が含まれます。

' 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) 

今、エラーはありませんが、サブは文字列を変更していないようです。何か不足していますか?

>>> 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 に変更したいと思います。

4

1 に答える 1

2

r''リテラルプレフィックスは、すべてのスラッシュをリテラルとして解釈するようにします。つまり、r'\x00'単一のゼロバイトではなく4文字です。

ランダムバイトが正規表現メタ文字として解釈されないようにするには、re.escape関数を使用できます。

置換文字列でプレフィックスとサフィックスが繰り返されないようにするには、正規表現の先読み、後読みを使用できます。

>>> 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させるためにも正規表現フラグが必要になる場合があります。.

于 2012-07-18T10:40:39.957 に答える