正则表达式列表中的整数之和

时间:2019-06-27 14:33:58

标签: python regex list casting

使用从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']

3 个答案:

答案 0 :(得分:1)

您必须将(嵌套的)列表中的项目从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]

(在交互式外壳中尝试使用这些文件时,请记住,在每个文件之后,该文件都会“用尽”,因此在测试下一个文件之前,必须重新打开该文件。另外请注意,使用{{1 }},如果文件中包含浮点数或IP地址,则可能会得到令人惊讶的结果。

答案 1 :(得分:1)

我首选的正则表达式解决方案是使用迭代器并在解析输入字符串时计算总和:

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

答案 2 :(得分:0)

带有注释说明的工作代码

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)