干草堆简化中的数字

时间:2017-08-06 18:06:52

标签: python

我正在使用Coursera中的Python课程,该课程涉及使用正则表达式。目的是通读文本和数字文件,提取所有数字,并将它们相加。对于示例数据(http://py4e-data.dr-chuck.net/regex_sum_42.txt),我有以下代码:

import re
handle = open("regex_sum_42.txt")
numlist=list()
for line in handle :
    line = line.rstrip()
    stuff = re.findall('([0-9.]+)',line)
    for element in stuff :
        try :
            num = int(element)
            numlist.append(num)
        except :
            continue
print(sum(numlist))

由于“stuff”列表还包括空格(没有数字的行)和'。',我认为我需要try / except行来防止回溯错误。有没有更简单的方法来实现这个程序,没有第二个for循环?

2 个答案:

答案 0 :(得分:2)

我不明白为什么你在你的正则表达式中添加一个点.,因为你的代码和示例数据都表明你想要只解析整数,以及(b)样本文件只包含整数。

如果您只想解析整数,您只需使用:

import re

rgx = re.compile(r'\-?\d+')

the_sum = 0
with open("regex_sum_42.txt") as handle:
    for line in handle:
        the_sum += sum(int(x) for x in rgx.findall(line))

print(the_sum)

因此我们使用仅匹配数字的正则表达式,并且不将这些数字存储到列表中,因为它只占用内存。我们可以立即计算出该行的总和,然后将它们相加。正则表达式还包含一个可选符号\-?,因为-2之类的负数也是数字。然后产生:

445833

如果允许花车。问题更难,因为现在它取决于您允许的格式。如果您只是允许小数点后跟零或更多位数,我们可以使用:

import re

rgx = re.compile(r'\-?\d+(?:\.\d*)?')

the_sum = 0
with open("regex_sum_42.txt") as handle:
    for line in handle:
        the_sum += sum(float(x) for x in rgx.findall(line))

print(the_sum)

请注意,我们使用非捕获组 (?:..)作为正则表达式,否则findall将仅返回捕获部分(小数点后面的内容,包括点) )。然后该程序产生:

445833.0

字边界

该文字包含'http://www.py4e.com/code3/'这样的代码段,这也会将'4''3'解析为数字。我们可以使用单词边界'\b'来阻止:

import re

rgx = re.compile(r'\b\-?\d+(?:\.\d*)?\b')

the_sum = 0
with open("regex_sum_42.txt") as handle:
    for line in handle:
        the_sum += sum(float(x) for x in rgx.findall(line))

print(the_sum)

现在它产生:

445822.0

因此结果与之前的结果不同,共计11个。

答案 1 :(得分:0)

import re

fh=open("regex_sum_345631.txt")

rd=fh.read()

sums=0

x=re.findall("[0-9]+",rd)

for i in x:
    sums+=int(i)

print(sums)