Я написал программу для сопоставления всех вхождений определенного шаблона двоичных данных (работающих в шестнадцатеричном формате) среди других случайных данных.Это происходит любое количество раз больше 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'
aka
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]«!
Что дает?Я думал, что это будет эквивалентно для этих данных.Есть кое-что, что я не понимаю о том, как эти шаблоны компилируются.Может ли кто-нибудь более опытный с регулярным выражением помочь мне?По профессии я не программист, но понимание этого поможет мне улучшить эту программу.
Заранее спасибо.