Почему re.findall ведет себя по-разному с группами захвата?

Почему findall в питоне захватывает не все группы , которые подходят под регулярные выражение

Вот задача которую я хочу решить

17641 Основная волна 19.06.24 (Уровень: Гроб)

Текстовый файл состоит из десятичных цифр, знаков «+» и «*» (сложения и умножения). Определите максимальное количество символов в непрерывной последовательности, являющейся корректным арифметическим выражением с целыми неотрицательными числами (без знака), значение которого равно нулю. В этом выражении никакие два знака арифметических операций не стоят рядом, порядок действий определяется по правилам математики. В записи чисел отсутствуют незначащие (ведущие) нули.

В ответе укажите количество символов. и у меня есть два решение первое которое работает и выдает правильный ответ

import re 
nat = r'(?:[1-9][0-9]*|0)'
exp = fr"{nat}(?:[+*]{nat})*"
a = open("C:/Users/artem/Downloads/24_17641.txt").read()
start  = 0 
zone = 900
ans = []
for _ in range(len(a)):
    try : 
        ans.append(re.search(exp , a[start : start + zone])[0])
        start +=1
    except :
        pass
for d in sorted(ans , key = len , reverse= 1 ):
    if eval(d) == 0 : 
        print(d , len(d));break

введите сюда описание изображения он является верным а есть второй код в который ищет через findall


import re 
nat = r'(?:[1-9][0-9]*|0)'
exp = fr"{nat}(?:[+*]{nat})*"
a = open("C:/Users/artem/Downloads/24_17641.txt").read()
print(max(list(re.findall(exp , a)) , key= lambda x : [eval(x) == 0 , len(x)]));print(len(max(list(re.findall(exp , a)) , key= lambda x : [eval(x) == 0 , len(x)])))

и вот ответ от этого решения введите сюда описание изображения

И я не понимаю почему findall (да-да ALL) не находит все подстроки
если нужно то вот сайт на котором взята задача https://kompege.ru/task номер задачи 17641


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

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

re.findall(pattern, string, flags=0)

Return all non-overlapping matches of pattern in string, as a list of strings or tuples. ...

Вот этот код, сделанный из вашего, вернёт только одно совпадение:

import re 

nat = r'(?:[1-9][0-9]*|0)'
exp = fr"{nat}(?:[+*]{nat})*"
a = '1+0+1'
print(*(re.findall(exp, a)))
$ python demo.py
1+0+1

Ещё демонстрация. Угадайте сколько совпадений будет найдено:

import re 

print(*(re.findall('..', 'abcdefgh')))

Найдено четыре совпадения, хотя пар символов в строке семь штук:

$ python pairs.py
ab cd ef gh
→ Ссылка