Вы можете сопоставить перекрывающийся контент со стандартным синтаксисом регулярных выражений, используя группы захвата внутри косвенных утверждений, поскольку они могут совпадать с частями строки, не используя сопоставленную подстроку и, следовательно, исключая ее из дальнейших сопоставлений. В этом конкретном примере c мы сопоставляем либо начало строки, либо >
в качестве якоря для утверждения предпросмотра, которое фиксирует наши реальные цели:
(?:\A|>)(?=([a-c]*<\w+>[a-c]*))
См. regex demo .
В python мы затем используем свойство re.findall()
, чтобы возвращать только совпадения, захваченные в группах, когда группы захвата присутствуют в выражении:
text = '<foo>abcaaa<bar>a<foo>cbacba<foo>c'
expr = r'(?:\A|>)(?=([a-c]*<\w+>[a-c]*))'
captures = re.findall(expr, text)
print(captures)
Вывод:
['<foo>abcaaa', 'abcaaa<bar>a', 'a<foo>cbacba', 'cbacba<foo>c']