gpt4 book ai didi

python - 字节模式的正则表达式匹配给出了不寻常的结果 - '.' 不等于 [\x00-\xff]

转载 作者:行者123 更新时间:2023-12-01 08:36:19 30 4
gpt4 key购买 nike

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

其中一些值会发生变化,因此我必须使用点在正则表达式模式中表示它们。

我注意到这个模式不起作用(最后的 2 个点无法匹配,就像模式中的匹配,直到添加这 2 个点然后它无法匹配):

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]' 匹配!

什么给了?我原以为这些对于这个数据来说是等价的。我不明白这些模式是如何编译的。对正则表达式更有经验的人可以帮助我吗?我不是一名程序员,但理解这一点将帮助我改进这个程序。

提前致谢。

最佳答案

对于字节也是同样的规则,如果你想匹配包括换行符在内的所有字符,则在使用点时必须使用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).

关于python - 字节模式的正则表达式匹配给出了不寻常的结果 - '.' 不等于 [\x00-\xff],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53707620/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com