1

私は理解できない奇妙な振る舞いをしています:

ファイルを開くと、バイトが見つかりますが、一度に 1 回だけです。

f = open('d:\BB.ki', "rb")
f10 = re.findall( b'\x03\x00\x00\x10''(.*?)''\xF7\x00\xF0', f.read() )
print f10
['1BBBAAAABBBBAAAABBBBAAAABBBBAAAA\x00']

f = open('d:\BB.ki', "rb")
f11 = re.findall( b'\x03\x00\x00\x11''(.*?)''\xF7\x00\xF0', f.read() )
print f11
['2AAABBBBAAAABBBBAAAA\x00']

ファイルを開いて数バイトを取得しようとすると、最初のバイトしか取得できません (f11 は空です)。

f = open('d:\BB.ki', "rb")
f10 = re.findall( b'\x03\x00\x00\x10''(.*?)''\xF7\x00\xF0', f.read() )
f11 = re.findall( b'\x03\x00\x00\x11''(.*?)''\xF7\x00\xF0', f.read() )
print f10,f11
['1BBBAAAABBBBAAAABBBBAAAABBBBAAAA\x00'] **[]**

ループなどを使用できますか?

ありがとう

4

2 に答える 2

1

を呼び出した後f.read()、読み取ることができるバイトがなくなるため、2 回目の呼び出しでf.read()は空の文字列が返されます。2 回読み取る代わりに、f.read() の結果を保存します。

s = f.read()
f10 = re.findall( b'\x03\x00\x00\x10''(.*?)''\xF7\x00\xF0', s)
f11 = re.findall( b'\x03\x00\x00\x11''(.*?)''\xF7\x00\xF0', s) 

データを 1 回だけスキャンして、両方の式を見つけることもできます。

matches = re.findall( b'\x03\x00\x00[\x10\x11]''(.*?)''\xF7\x00\xF0', s)

ファイルにバイトが含まれている場合、'\x03\x00\x00\x10\x03\x00\x00\x11_\xF7\x00\xF0'提案した方法では 2 つの重複する一致 (\x03\x00\x00\x11_および_) が検出されますが、シングル スキャン アプローチでは 1 つの一致のみが検出されます。

于 2012-07-05T13:30:03.870 に答える
0

f.read()ファイル全体を消費します。f10 のみが表示されます。

これを試してみてください。

 for line in open('d:\BB.ki', "rb").readlines():
    f10 = re.findall( b'\x03\x00\x00\x10''(.*?)''\xF7\x00\xF0', line )
    f11 = re.findall( b'\x03\x00\x00\x11''(.*?)''\xF7\x00\xF0', line )
于 2012-07-05T13:27:53.570 に答える