Со списком целых чисел, созданным из re.findall(), как мы можем создать сумму для целых чисел?
Пример файла:
A number: 606
Another number could be 52 or 38
Another number below:
55
Распечатывает список, созданный с помощью захватов RegEx:
import re
fileHandle = open("sample.txt", "r")
for line in fileHandle:
#RegEx: Match all ints anywhere in line
num = re.findall("\d+", line)
print(num)
Выход:
['606']
['52', '38']
[]
['55']






Рабочий код с пояснениями в комментариях
import re
sumInts = 0
fileHandle = open("sample.txt", "r")
for line in fileHandle:
#RegEx: Match all ints anywhere in line
num = re.findall("\d+", line)
#Cast list entries to ints (might not be needed?)
num = [int(i) for i in num]
#Sums all ints from RegEx capture
for i in num:
sumInts = sumInts + i
print(sumInts)
Вы должны преобразовать элементы (вложенного) списка из str в int. Вы можете сделать это в одном выражении вложенного генератора, используя встроенную функцию sum:
>>> sum(int(x) for line in filehandle for x in re.findall(r"\d+", line))
751
Или без вложенности, используя read(), чтобы получить все содержимое файла (если он не слишком большой):
>>> sum(int(x) for x in re.findall(r"\d+", filehandle.read()))
751
Или используя map вместо выражения генератора:
>>> sum(map(int, re.findall(r"\d+", filehandle.read())))
751
Или, если вам нужны суммы в строке (версия map оставлена в качестве упражнения для читателя):
>>> [sum(int(x) for x in re.findall(r"\d+", line)) for line in filehandle]
[606, 90, 0, 55]
(Когда вы пробуете их в интерактивной оболочке, помните, что файл будет «исчерпан» после каждого из них, поэтому вам придется повторно открывать файл перед тестированием следующего. Также обратите внимание, что с помощью \d+ вы можете получить неожиданные результаты. если ваш файл содержит, например, числа с плавающей запятой или IP-адреса.)
@RomanPerekhrest Учитывая, что ввод читается из файла, я сомневаюсь, что это имеет большое значение. Без части чтения файла (с использованием многострочной строки или списка строк соответственно) генератор double-for-generator немного медленнее, чем два других.
Хорошее замечание по неровностям с поплавками и IP-адресами. Для этого может подойти захват, соответствующий шаблону, содержащему не более одного десятичного знака, если только я что-то не упустил.
@Reubens4Dinner Это может быть немного сложнее, см., например. здесь.
@Reubens4Dinner О, и, конечно же, если вы записываете числа с плавающей запятой, не забудьте преобразовать их в float вместо int.
Мое предпочтительное решение для регулярных выражений — использовать итератор и вычислять сумму при анализе входной строки:
input = """A number: 606
Another number could be 52 or 38
Another number below:
55"""
sum = 0
for match in re.finditer("\d+", input):
sum = sum + int(match.group())
print("sum is: " + str(sum))
Это печатает:
sum is: 751
Интересно, какой из них будет быстрее