我正在使用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循环?
答案 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)