Почему 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 шт):
Потому что 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
