Сумма целых чисел в списке регулярных выражений

Со списком целых чисел, созданным из 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']
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
117
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Рабочий код с пояснениями в комментариях

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 27.06.2019 16:42

@RomanPerekhrest Учитывая, что ввод читается из файла, я сомневаюсь, что это имеет большое значение. Без части чтения файла (с использованием многострочной строки или списка строк соответственно) генератор double-for-generator немного медленнее, чем два других.

tobias_k 27.06.2019 16:43

Хорошее замечание по неровностям с поплавками и IP-адресами. Для этого может подойти захват, соответствующий шаблону, содержащему не более одного десятичного знака, если только я что-то не упустил.

Reubens4Dinner 27.06.2019 16:50

@Reubens4Dinner Это может быть немного сложнее, см., например. здесь.

tobias_k 27.06.2019 16:54

@Reubens4Dinner О, и, конечно же, если вы записываете числа с плавающей запятой, не забудьте преобразовать их в float вместо int.

tobias_k 27.06.2019 17:10

Мое предпочтительное решение для регулярных выражений — использовать итератор и вычислять сумму при анализе входной строки:

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

Другие вопросы по теме