使用Python正则表达式求和整个文本中随机放置的整数

时间:2019-01-03 03:03:58

标签: python regex python-3.x

所以我有一个文本文件,其中包含如下几行:

“这是10个约4个通用文本。

说5与1无关4

我只是在用它,

使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'] )。 Len过滤掉不包含数字的行(['10','4'],['4','5','1'],['2','2'])。 List(map())将列表从字符串转换为整数([10,4],[4、5、1],[2、2]),并将sum(num)分配给每个列表的总和([14] ,[10],[4])。从这里开始,我试图对这三个数字求和。我猜我正在寻找的是sum(total(sum(num))),但是Python不喜欢那样。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

您不必每行都使用正则表达式:

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()))))

答案 1 :(得分:0)

tt = ([14], [10], [4])
print (sum(i[0] for i in tt))
#28

希望这对您有帮助

答案 2 :(得分:0)

您可以轻松地做到这一点,而无需一行一行地阅读文本。

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))

答案 3 :(得分:0)

您可以使用不带参数的read,并且将读取并返回文件的全部内容。然后findall将返回一个字符串列表,您可以将其映射到一个int,然后将整个列表求和。

但是您的正则表达式将在整个内容中匹配数字,例如2x + yk8sz3

您可以更新正则表达式,以使用否定的前瞻性和否定性的后瞻性来断言之前和之后的内容不是非空格字符:

(?<!\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)