как получить следующие 2 байта из байтового массива после совпадения

#arrays #python-3.x #regex

#массивы #python-3.x #регулярное выражение

Вопрос:

У меня есть bytearray:

 s = b'x01x80x00x04_xa9xa20x01x19x00'
  

Я хочу выполнить поиск и найти:

 xa9xa20
  

Затем, как только я найду, я хочу получить следующие 2 байта после этого. В этом случае:

 x01x19
  

Я пробовал:

 m = re.search(b'[(?:xa9xa20)]{2}',s,re.DOTALL).group(1)
  

Но получите ошибку индекса:

 m = re.search(b'[(?:xa9xa20)]{2}',s,re.DOTALL).group(1)
IndexError: no such group
  

Комментарии:

1. Почему вы помещаете группу внутрь [] ?

Ответ №1:

Здесь у вас поврежден шаблон регулярных выражений, поскольку вы помещаете (?:xa9xa20) группу без захвата в класс символов (повторяется дважды). Однако простое удаление квадратных скобок не поможет.

Вы можете исправить код, используя

 import re
s = b'x01x80x00x04_xa9xa20x01x19x00'
m = re.search(b'xa9xa20(.{2})', s, re.DOTALL)
if m:
    print(m.group(1)) # => b'x01x19'
  

Смотрите демонстрацию Python

То есть, вместо того, чтобы безуспешно пытаться сопоставить два последовательных вхождения xa9xa20 байтов, сопоставьте xa9xa20 последовательность байтов один раз, а затем сопоставьте и захватите любые два байта после них с помощью (.{2}) capturing group .

Комментарии:

1. Есть ли способ добавить переменную для количества байтов, чтобы получить {2} . Допустим, если бы я хотел установить x = 2 и использовать его как b’xa9 xa20(.{x})’ (пробовал этот способ, но не работает)?

2. @magicsword Да, используйте что-то вроде x = 2 , а затем просто объедините части: m = re.search(b'xa9xa20(.{' str(x).encode('utf8') b'})', s, re.DOTALL) , см. Демонстрацию Python .

Ответ №2:

Попробуйте этот шаблон:

\xa9\xa20(\xa?d \xa?d )

Смотрите Демонстрацию в Regex101