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()没有更多字节可供读取,因此第二次调用f.read()将返回一个空字符串。存储 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) 

您可能还想只扫描一次数据,找到两个表达式:

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

如果您的文件包含字节'\x03\x00\x00\x10\x03\x00\x00\x11_\xF7\x00\xF0',您建议的方法将找到两个重叠的匹配项(\x03\x00\x00\x11__),而单次扫描方法仅找到一个匹配项。

于 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 回答