#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 .