regex 提取一个文件中的所有数字并计算这些数字的和

fcg9iug3  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(150)

我在尝试从文件中提取数字时遇到了这个问题。它阻止了我自己解决它,因为很难找到正确的正则表达式模式来提取数字,因为它很复杂。我写了一个程序来从文件中提取数字并计算总和。然而,我遇到了一些数字在总数中丢失或丢失计数,所以总和是错误的。总行数是错误的,所以总数是错误的。我遇到了困难,找到正确的正则表达式模式,以提取整数从这个文件。我尝试了许多方法来解决它。
文件:http://py4e-data.dr-chuck.net/regex_sum_42.txt

import re
name = open('Sample data.txt')
sum = 0
count = 0
for line in name:
line = line.rstrip()
if line.isdigit():
    y2 = re.findall('[0-9]+',line)
    sum = sum + int(y2[0])
    count = count + 1
else:
    continue
print(y2,sum,count)

我试着:
1.已打开并读取提供的文件。
1.从python库导入正则表达式。
1.签了名算了总数但错了。
1.使用正则表达式模式([0-9]+)从文件中提取整数
1.创建了一个计数来计算要加总的行或值,但它是错误的。
1.([0-9]+)-过滤文件中的所有数字。但是,它不能产生结果,因为数字被插入文件的任何部分,因此丢失了一些数字。
预期结果:有90个值,总和=445833

dnph8jn4

dnph8jn41#

您的主要问题在这一行:

if line.isdigit():

除非line中的 every 字符都是数字,否则不会发生任何事情。实际上您并不需要这样做,因为正则表达式匹配将确保您在每行中只找到数值。
你的另一个问题是使用sum作为变量名,因为这将阻止使用内置函数sum,这对这个问题很有用。将其改为类似total的东西。
这段代码应该可以做到你想要的:

total = 0
count = 0
with open('Sample data.txt') as file:
    for line in file:
        y2 = re.findall(r'\d+', line)
        total += sum(map(int, y2))
        count += len(y2)

print(f'{count} values summing to {total}')

对于您的示例文本文件,这将给出:

90 values summing to 445833

如所期望的。
注意,如果需要处理(可能)有符号的数字,应该将regex改为

[+-]?\d+
oknrviil

oknrviil2#

如果你使用的是re模块,那么没有理由使用for-loop

import re

with open("sample_data.txt") as f:
    print(sum(map(float, re.findall("\d+(?:\.\d+)?", f.read()))))

445833.0

注意,我使用了\d+(?:\.\d+)?这是为了捕获像123.456这样的十进制数(如果它们存在于您的文件中)。

相关问题