gpt4 book ai didi

python - Haystack 简化中的数字

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:40 26 4
gpt4 key购买 nike

我正在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com