大海捞针的数字简化

2024-03-29 12:52:09 发布

您现在位置: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循环?在


Tags: inretxtforline数字elementnum
1条回答
网友
1楼 · 发布于 2024-03-29 12:52:09

我不明白为什么要在正则表达式中加一个点.,因为代码和示例数据都表明(a)您只想解析整数,(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)

所以我们使用只匹配数字的正则表达式,不将这些数字存储到列表中,因为它只消耗内存。我们可以马上计算出那条线的和,然后把它们相加。regex还包含一个可选符号\-?,因为负数如-2也是数字。然后产生:

^{pr2}$

如果允许浮动。这个问题更难解决,因为现在它取决于你允许什么格式。如果您只允许小数点后跟零位或更多位数,我们可以使用:

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)

注意,我们使用一个非捕获组(?:..)作为regex,否则{}只返回捕获部分(小数点后面的内容,包括点)。然后程序生成:

445833.0

词的界限

文本包含一个类似'http://www.py4e.com/code3/'的片段,这将把'4'和{}解析为数字。我们可以使用单词边界'\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个。在

相关问题 更多 >