Как получить следующий код, чтобы не вызывать ошибку 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.*)'