Регулярное выражение на двоичных данных в Python 3.6 показывает странное поведение - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь написать небольшой скрипт, который читает двоичные данные из файла перед дальнейшей обработкой, например, с помощью regex для упрощения некоторых шагов.

Во время regex я вижу странное поведение, которое я простоне могу понять из.Код в основном выглядит следующим образом (сильно урезан, чтобы просто включить соответствующую часть):

fh = open(filename,'rb')
bd = fh.read(32) # binary data
xlen = bd[3] # byte that specifies length of a command - this may vary for each 32h byte read
bd_x = bd[4:4+xlen] # pick out interesting part of the data. for the data I see the weird behavior the length of bd_x will always be 7
if re.match(b'\x00((.*?){%d})\x30'%(xlen-2),bd_x):
    update some other lists, etc

Просто нужно проверить, является ли начало интересных данных \x00, а конец - \x30 с 5 другими элементамимежду которыми значение не имеет значения.Общая длина, включая начало и конец, который я пытаюсь сопоставить, таким образом, как упоминалось, равна 7.

В моем образце файла со случайными данными это работает примерно на 100 из 130 32-байтовых кусков, для которых онодолжен совпадать на всех 130, а не только на 100.

Я распечатал содержимое bd_x для обоих случаев, например для кусков, где это работало, и кусков, где это не так.Вывод из print(xlen,hexlify(bd_x)) (n для отрицательного, p для положительного).

n 7 b'000000290a0030'
n 7 b'0000002b0a0030'
n 7 b'0000002d0a0030'
n 7 b'0000002f0a0030'
n 7 b'000000310a0030'
n 7 b'000000330a0030'
p 7 b'00000003000030'
p 7 b'00000005000030'
p 7 b'00000000000030'
p 7 b'00000000020030'

Насколько я вижу, все сэмплы должны были совпадать в регулярном выражении.Если я изменю на re.search, это совпадет на всех 130 чанках, но я не знаю, почему re.match не работает для всех чанков данных, так как начало всегда совпадает с \x00, и остальные тоже должны совпадать.

Я вручную проверил все записи тестового файла, которые не работают в hex-редакторе, и я просто не понимаю, почему он не работает с этими записями.

Iзнаю, что я, вероятно, могу просто сделать hexlify(bd_x) и просто работать с выводом из этой функции, но сейчас мне интересно выяснить, почему это не работает.

Предложения / решения приветствуются.

...