【问题标题】:Numbers in a Haystack simplification干草堆简化中的数字
【发布时间】:2017-08-06 18:06:52
【问题描述】:

我正在 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 循环?

【问题讨论】:

  • 如果要解析整数,为什么要加.
  • 您是否也在尝试对浮点数求和?
  • 您的正则表达式不正确。您的模式将匹配一个或多个数字零到九个一个或多个十进制字符。你可能想要的是更像这样的东西:\d+(.\d+)?

标签: python


【解决方案1】:

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

所以我们使用只匹配数字的正则表达式,并且不要将这些数字存储到列表中,因为它只消耗内存。我们可以立即计算那条线的总和,然后将它们相加。正则表达式还包含一个可选符号\-?,因为像-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/' 的sn-ps,这也会将'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 个。

【讨论】:

    【解决方案2】:
    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多