регулярное выражение с необязательной группой без захвата - PullRequest
2 голосов
/ 22 марта 2020

Как получить следующий код, чтобы не вызывать ошибку AssertionError? Я пытаюсь захватить группу с xyz в ней и использовать необязательный позитивный взгляд не захватывающая группа (?:</div>)?, но я не могу заставить ее работать. Каким должен быть мой pattern?

import re

s1 = '<div foo=bar>ABC xyz DEF</div><div>GHI</div>'
s2 = '<foo><bar>JKL xyz MNO</foo></bar><baz>PQR</baz>'
s3 = '<div>zyx</div>'

# pattern = r'(?:<div.*?>)?(.*?xyz.*?)(?:</div>)?'
# pattern = r'(?:<div.*?>)?(.*?xyz.*(?:</div>)?)'
pattern = pattern = r'(?:<div.*?>)?(.*?xyz.*?)(?:(?=</div>))'
m1 = re.findall(pattern, s1)
m2 = re.findall(pattern, s2)
m3 = re.findall(pattern, s3)

print(m1)
print(m2)
print(m3)

assert m1 == ['ABC xyz DEF']
assert m2 == ['<foo><bar>JKL xyz MNO</foo></bar><baz>PQR</baz>']
assert m3 == []

PS Не стесняйтесь редактировать заголовок моего вопроса.

РЕДАКТИРОВАТЬ: Я нашел это решение. Это не так элегантно, но работает:

pattern = r'(?:<div.*?>)?(.*?xyz.*?(?=</div>)|.*?xyz.*)'
...