我已经写了一个程序来匹配在随机的其他数据中出现的二进制数据(十六进制)的所有特定模式。它在文件中的任何位置出现的次数大于0。下面是我用来进行搜索的代码,其中f已经以读/写模式打开:
pattern = #pattern goes here
f.seek(0)
bytechain = f.read()
match_iter = re.compile(pattern).finditer(bytechain)
matches = [x.start() for x in match_iter]
下面是我尝试匹配的字符串之一的示例:
b'\xD4\x00\x00\x00\x3C\x13\x00\x00\x4D\x0D\x78\x0A\x5C\x00'
又名
b'\xD4\x00\x00\x00<\x13\x00\x00M\x0Dx\x0A\\x00'
其中一些值会发生变化,因此我必须在regex模式中使用点来表示它们
我注意到这个模式不起作用(末尾的两个点不匹配,因为在模式匹配中,直到这两个点相加,然后它就不匹配了):
pattern = b'\xD4[\x00]{3}..[\x00]{2}M...[\x5a-\x7f]'
但当模式更改为此模式时,它将与预期匹配:
pattern = b'\xD4[\x00]{3}[\x00-\xff]{2}[\x00]{2}M..[\x00-\xff][\x5a-\x7f]'
基本上,字节b“\x5C”似乎与“.”不匹配,但与“[\x00-\xff]”匹配
有什么好处?我原以为这些数据是等价的。关于这些模式是如何编译的,我有些不明白。有没有一个更有经验的人能帮我?我不是一个程序员的贸易,但了解这将有助于我提高这个程序
提前谢谢
这与
bytes
的规则相同,如果要匹配包括换行符在内的所有字符,则在使用点时必须使用re.DOTALL
倒霉的是你用
x0A
代替了你的最后一个点,那就是换行符相关问题 更多 >
编程相关推荐