字节模式的正则表达式匹配会产生不寻常的结果“.”不等同于[\x00\xff]

2024-09-26 17:52:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经写了一个程序来匹配在随机的其他数据中出现的二进制数据(十六进制)的所有特定模式。它在文件中的任何位置出现的次数大于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]”匹配

有什么好处?我原以为这些数据是等价的。关于这些模式是如何编译的,我有些不明白。有没有一个更有经验的人能帮我?我不是一个程序员的贸易,但了解这将有助于我提高这个程序

提前谢谢


Tags: 数据程序match模式patternx00iterx7f
1条回答
网友
1楼 · 发布于 2024-09-26 17:52:44

这与bytes的规则相同,如果要匹配包括换行符在内的所有字符,则在使用点时必须使用re.DOTALL

match_iter = re.compile(pattern,flags=re.DOTALL).finditer(bytechain)

倒霉的是你用x0A代替了你的最后一个点,那就是换行符

re.DOTALL

Make the '.' special character match any character at all, including a newline; without this flag, '.' will match anything except a newline. Corresponds to the inline flag (?s).

相关问题 更多 >

    热门问题