正则表达式匹配字节模式会产生异常结果-'。'不等于[\ x00- \ xff]

时间:2018-12-10 14:22:09

标签: python regex

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

a.k.a。

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

有什么作用?我以为这些对于这些数据将是等效的。关于这些模式的编译方式,我有些不了解。正则表达式方面经验丰富的人可以帮助我吗?我不是行业程序员,但了解这一点将有助于我改进该程序。

谢谢。

1 个答案:

答案 0 :(得分:1)

@php $total = 0; @endphp @foreach($sage_paylater_staging as $sg) @if( $sg->credit_code == $ledgers->id && $sg->credit_code != '') @php $total += $sg->amount; @endphp {{ number_format($sg->amount, 2) }} @endif @endforeach {{number_format($total, 2)}} 的规则相同,如果要匹配包括换行符在内的所有字符,则在使用点时必须使用bytes

re.DOTALL

运气不好,您用match_iter = re.compile(pattern,flags=re.DOTALL).finditer(bytechain) 代替了最后一个点,即换行符。

  

re.DOTALL

     

设为“。”特殊字符完全匹配任何字符,包括换行符;没有此标志,“。”将匹配换行符以外的任何内容。对应于内联标志(?s)。