Вам просто нужно добавить отрицательный запрос для слова, следующего сразу за начальной группой захвата, чтобы убедиться, что ваше регулярное выражение не может соответствовать (например) good good
:
import re
p = re.compile(r'(\b\w+\b)(?!\s\1\b)\s\w+\s\1\b')
m = p.findall('all in all day in and day out bit by bit good good good')
print(m)
Вывод:
['all', 'bit']
Если вы хотите включить перекрывающиеся совпадения, сделайте регулярное выражение положительным взглядом (спасибо @ggorlen):
p = re.compile(r'(?=(\b\w+\b)(?!\s\1\b)\s\w+\s\1\b)')
m = p.findall('foo bar foo bar foo')
Вывод:
['foo', 'bar', 'foo']
Если вы также необходимо удалить дубликаты совпадений, преобразовать в set
и обратно в list
:
p = re.compile(r'(?=(\b\w+\b)(?!\s\1\b)\s\w+\s\1\b)')
m = list(set(p.findall('foo bar foo bar foo')))
print(m)
Вывод:
['foo', 'bar']