Статья Автор: Деникина Н.В., Деникин А.В.

Вопрос 24. Поиск в тексте регулярными выражениями. Типовые паттерны. Часть 8 (Поиск пересекающихся совпадений)

Проблема

По умолчанию findall не находит пересекающиеся совпадения:

s = "AAAA"
re.findall(r'AA', s)  # ['AA', 'AA'] — только 2, хотя пересечений 3

# Позиции: 
# AA__ (0-1)
# _AA_ (1-2) — пересекается с предыдущим, НЕ НАЙДЕНО
# __AA (2-3)

Решение через позитивный просмотр вперёд



Как это работает

Позиция 0: A A A A
           ↑
           (?=(AA)) — впереди есть AA? Да! Захватываем в группу.
           Позиция НЕ сдвигается (просмотр не потребляет символы)
           
Позиция 1: A A A A
             ↑
           (?=(AA)) — впереди есть AA? Да! Захватываем.
           
Позиция 2: A A A A
               ↑
           (?=(AA)) — впереди есть AA? Да! Захватываем.
           
Позиция 3: A A A A
                 ↑
           (?=(AA)) — впереди есть AA? Нет, только A.
Печать