python 3.6中二进制数据的正则表达式显示奇怪的行为

时间:2018-10-13 22:24:28

标签: regex python-3.x binary-data

我正在尝试编写一个小脚本,该脚本从文件中读取二进制数据,然后再进一步处理它,例如regex简化了一些步骤。

在正则表达式期间,我看到了一些我无法弄清的怪异行为。代码基本上是这样的(简化后只包含相关部分):

fh = open(filename,'rb')
bd = fh.read(32) # binary data
xlen = bd[3] # byte that specifies length of a command - this may vary for each 32h byte read
bd_x = bd[4:4+xlen] # pick out interesting part of the data. for the data I see the weird behavior the length of bd_x will always be 7
if re.match(b'\x00((.*?){%d})\x30'%(xlen-2),bd_x):
    update some other lists, etc

只需检查有趣数据的开头是否为\x00以及end是否为\x30,中间还有5个其他元素,则它们的值无关紧要。如上所述,包括我要匹配的开始和结束在内的总长度为7。

在我具有随机数据的样本文件中,该文件适用于130个32h字节块中的大约100个,应该在所有130个字节上匹配,而不仅仅是100个。

我确实打印出了两种情况下bd_x的内容,例如用于有效的块和无效的块。来自print(xlen,hexlify(bd_x))的输出(n代表负,p代表正)。

n 7 b'000000290a0030'
n 7 b'0000002b0a0030'
n 7 b'0000002d0a0030'
n 7 b'0000002f0a0030'
n 7 b'000000310a0030'
n 7 b'000000330a0030'
p 7 b'00000003000030'
p 7 b'00000005000030'
p 7 b'00000000000030'
p 7 b'00000000020030'

据我所知,所有样本都应在正则表达式中匹配。如果我更改为re.search,则它在所有130个数据块上都匹配,但是tbh我不知道为什么re.match对所有数据块都不起作用,因为开始总是与\x00匹配,并且其余的也应该匹配。

我已经手动检查了在十六进制编辑器中失败的测试文件的所有条目,但我看不出为什么它不适用于那些条目。

我知道我可能可以做hexlify(bd_x)并只对那个函数的输出进行操作,但是现在我有兴趣弄清楚为什么它不起作用。

建议/解决方案表示赞赏。

0 个答案:

没有答案