Суммирование случайных чисел по всему тексту с помощью регулярных выражений Python - PullRequest
0 голосов
/ 03 января 2019

Итак, у меня есть текстовый файл с несколькими строками, такими как:

"Это 10 каких-то 4 общих текстов.

4 не имеет значения 5, что говорит 1

Я просто использую его,

Чтобы сделать 2 точкой 2. "

Я пытаюсь найти сумму чисел, разбросанных по тексту, используя re.findall.Пока у меня есть:

import re

handle=open('.txt')

for line in handle:

    num = re.findall('[0-9]+', line)
    if len(num)>0:
           num = list(map(int, num))
           total = sum(num)

И это насколько я могу получить.Использование re.findall назначает num серию списков строковых чисел (['10', '4'], ['4', '5', '1'], [], ['2', '2']).Лен отфильтровывает строки, которые не содержат чисел (['10', '4'], ['4', '5', '1'], ['2', '2']).List (map ()) преобразует списки из строк в целые числа ([10, 4], [4, 5, 1], [2, 2]) и присваивает сумму (num) общей сумме каждого списка ([14], [10], [4]).Отсюда я пытаюсь суммировать эти три числа.Я думаю, что я ищу, это сумма (общая (сумма (число))), но Python не нравится это.Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

0 голосов
/ 03 января 2019

Вы можете использовать read без аргумента, и все содержимое файла будет прочитано и возвращено.Затем findall вернет список строк, которые вы можете отобразить в int, и затем суммирует весь список.

Но ваше регулярное выражение будет соответствовать цифрам во всем содержимом, например, 2x + y, k8s иz3

Вы можете обновить свое регулярное выражение, чтобы использовать отрицательный взгляд вперед и отрицательный взгляд назад, чтобы утверждать, что предшествующее и последующее не является символом без пробелов:

(?<!\S)\d+(?!\S)

См. regex demo | Python demo

Например:

import re
with open('text.txt') as handle:
    total = sum(map(int, re.findall(r"(?<!\S)\d+(?!\S)", handle.read())))
    print(total)
0 голосов
/ 03 января 2019

Вы можете сделать это легко, не читая текст построчно.

import re
pattern = re.compile(r'\d+')
with open('.txt') as f:
    text = f.read()
    summation = sum(int(x) for x in pattern.findall(text))
0 голосов
/ 03 января 2019

Вам не нужно применять регулярные выражения в каждой строке:

In [1]: import re

In [2]: txt = """This is 10 some 4 generic text.
   ...:    ...:
   ...:    ...: It doesn't 4 matter 5 what it says 1
   ...:    ...:
   ...:    ...: I'm just using it,
   ...:    ...:
   ...:    ...: To make 2 a 2 point."""

In [3]: sum(map(int, re.findall(r"\d+", txt)))
Out[3]: 28

Так что с текстовым файлом это должно работать:

import re

with open("input.txt", "r") as handle:
    print(sum(map(int, re.findall(r"\d+", handle.read()))))
0 голосов
/ 03 января 2019
tt = ([14], [10], [4])
print (sum(i[0] for i in tt))
#28

Надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...