Соответствие регулярному выражению шаблона байтов дает необычные результаты - '.'не эквивалентно [\ x00- \ xff] - PullRequest
0 голосов
/ 10 декабря 2018

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

Что дает?Я думал, что это будет эквивалентно для этих данных.Есть кое-что, что я не понимаю о том, как эти шаблоны компилируются.Может ли кто-нибудь более опытный с регулярным выражением помочь мне?По профессии я не программист, но понимание этого поможет мне улучшить эту программу.

Заранее спасибо.

1 Ответ

0 голосов
/ 10 декабря 2018

это то же правило для bytes, вы должны использовать re.DOTALL при использовании точек, если вы хотите сопоставить все символы, включая символ новой строки

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

Не повезло, у вас есть x0A вместоВаша последняя точка, которая является новой строкой.

re.DOTALL

Сделайте '.'специальный символ соответствует любому символу вообще, включая перевод строки;без этого флага '.'будет соответствовать чему-либо, кроме новой строки.Соответствует встроенному флагу (? S).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...