Python:半字节二进制文件的正则表达式搜索模式

7
我正在使用以下正则表达式模式在二进制文件中搜索0xDEAD4FAD:
```regex \xDE\xAD\x4F\xAD ```
请注意,此模式仅适用于查找确切的字节序列。
my_pattern = re.compile(b"\xDE\xAD\x4F\xAD")

但是如何将搜索模式泛化以搜索0xDEAD4xxx?似乎无法截取半字节。


2
第一次搜索的字节是正则表达式元字符时,你会感到头痛。 - user2357112
3个回答

12

正则表达式可以允许搜索范围。因此,要查找第一个四位数为"4"的字节,请使用:

正则表达式可以用于搜索一定范围内的内容。如果想要查找第一个十六进制位为"4"的字节,可以使用以下表达式:

pattern = re.compile(b"[\x40-\x4F]")

以下测试显示它生成了期望的输出:

>>> for byte in ('\x3f', '\x40', '\x42', '\x4f', '\x50'): print bool(pattern.search(byte))
... 
False
True
True
True
False

要回答你关于搜索0xDEAD4xxx的具体问题,请使用:

my_pattern = re.compile(b"\xDE\xAD[\x40-\x4F].")

嘿,如果我想让搜索结果将最后3个十六进制字符作为单独的组返回给我怎么办?我该如何在你制作的那个东西之间插入()? - bFig8
很遗憾,据我所知,分组只能按字节进行,而无法按半字节进行分组。 - John1024
嘿,情况并不那么糟糕。Python 提供了按位操作。因此,您可以取一个字节并将上半字节或下半字节清零,然后只使用剩下的部分。 - John1024
如果你有一些字节,比如 byte=b'\x3c',那么将其转换为整数后,低位半字节是 ord(byte) & ord(b'\x0f'),高位半字节是 (ord(byte) & ord(b'\xf0')) / 16 - John1024
我使用以下代码来获取两个组: my_pattern = re.compile(b"\xDE\xAD([\x40-\x4F][\x00-\xFF])") 然后执行以下操作: my_integer = int(binascii.hexlify(sr.group(1)[-3:],16); - bFig8

0

我认为最好的方法是将二进制字符串转换为ASCII十六进制字符串,然后对其应用正则表达式。我不认为正则表达式旨在处理二进制数据;你可能能够让它工作,但不要惊讶如果有一些意外情况发生。


-2

如果我处在你的情况下,我会尝试使用grep和hexdump。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接