По умолчанию findall не находит пересекающиеся совпадения:
s = "AAAA"
re.findall(r'AA', s) # ['AA', 'AA'] — только 2, не 3
Позитивный просмотр вперёд (?=...) — проверяет, но не потребляет символы:
s = "AAAA"
re.findall(r'(?=(AA))', s) # ['AA', 'AA', 'AA'] — 3 пересечения
Как это работает:
(?=AA) — "здесь впереди есть AA" (не двигает указатель)
(AA) внутри — захватывает это AA