python - Haystack 简化中的数字

标签 python

我正在 Coursera 上一门涉及使用正则表达式的 Python 类(class)。目的是通读文本和数字文件,提取所有数字,并对它们求和。对于样本数据 ( 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 循环?

最佳答案

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

如果您只想解析整数,您可以简单地使用:

import re

rgx = re.compile(<b>r'\-?\d+'</b>)

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

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

import re

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

the_sum = 0
with open("regex_sum_42.txt") as handle:
    for line in handle:
        the_sum += sum(<b>float(x)</b> 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(<b>r'\b\-?\d+(?:\.\d*)?\b'</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个。

关于python - Haystack 简化中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45535082/

相关文章:

python - 无法使用 opencv 和 python 在相机校准和 3D 重建中绘制极线

python - 将列表从 python 保存到文本文件中

python - 迭代嵌套的 Python 字典

python - 将列表列表中的元素添加到 Python 中的字典中

python - 查找工具/脚本/子目录

python - 如何找到图像中物体的中心和角度?

读取文件时Python编码问题

python - 已发布的 pypi 包显示在搜索中,但不会 pip install

Python 3.5.1同目录下导入类

python - Pandas :合并数据框而不创建新列