regex with optional positive lookahead non-capturing group

Viewed 96

How do I get the following code to not raise an AssertionError? I'm trying to capture the group with xyz in it and use an optional positive lookahead non-capturing group (?:</div>)?, but I can't get it to work. What should my pattern be?

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 == []

P.S. Feel free to edit the title of my question.

EDIT: I came up with this solution. It's not that elegant, but it works:

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