从文本文件中使用正则表达式提取字符串并求和

4
我正在学习Python并需要帮助完成我的课程作业。
我有一个包含文本和数字的文件。有些行中有一到三个数字,而其他行则没有数字。
我需要:
1. 使用正则表达式仅提取文件中的数字
2. 找出所有数字的总和
我使用了正则表达式来提取所有数字。我正在尝试获取所有数字的总和,但是我只得到了每行具有数字的数字总和。 我一直在努力想出各种方法来完成这个任务,并且这是我最接近正确的方法。
我知道我错过了一些关键部分,但我不确定我做错了什么。
以下是我的代码:
import re
text = open('text_numbers.txt')

for line in text:
    line = line.strip()
    y = re.findall('([0-9]+)',line)

    if len(y) > 0:
        print sum(map(int, y))

我得到的结果是这样的(每个数字是一行的总和):

14151

8107

16997

18305

3866

需要将它们求和,得到一个数字(所有数字的总和):

134058


将 print sum(map(int, y)) 改为 x += sum(map(int, y)),并在 for 循环之前添加 x = 0。在 for 循环结束时打印 x。 - reticentroot
11个回答

2

我不是很懂Python,但我可以提供一个简单的解决方案。 试一下这个

import re
hand = open('text_numbers.txt')
x=list()
for line in hand:
    y=re.findall('[0-9]+',line)
    x=x+y
sum=0
for i in x:
    sum=sum + int(i)
print sum

2
import re
import np
text = open('text_numbers.txt')
final = []
for line in text:
    line = line.strip()
    y = re.findall('([0-9]+)',line)

    if len(y) > 0:
         lineVal = sum(map(int, y))
         final.append(lineVal)
         print "line sum = {0}".format(lineVal)
 print "Final sum = {0}".format(np.sum(final))

这是您在寻找的内容吗?

谢谢Ryan。在我的一个变体中,我有类似的东西,但无法使其工作。我不得不修改“import np”才能让它工作。 - MacLovin

2

这是我第一次尝试使用正则表达式来回答问题,我发现阅读别人的代码是一个非常好的练习技能。

import re # import regular expressions
chuck_text = open("regex_sum_286723.txt")
numbers = []
Total = 0
for line in chuck_text:
    nmbrs = re.findall('[0-9]+', line)
    numbers = numbers + nmbrs 
for n in numbers:
    Total = Total + float(n)
print "Total = ", Total 

感谢 Beer 提供的“理解列表”一行代码,尽管他的 'r' 似乎不需要,我不确定它的作用。但它读起来很漂亮,我阅读两个循环时更加困惑。

import re
print sum([int(i) for i in re.findall('[0-9]+',open("regex_sum_286723.txt").read())])

嗨,安德鲁,欢迎来到SO。这里不鼓励只给出代码的回答,因为这样无法教会他人如何编程。你能否编辑你的帖子,解释一下你的代码示例是做什么的,以及它如何回答了问题?谢谢。 - Tim Malone

0
import re
print sum([int(i) for i in re.findall('[0-9]+',open(raw_input('What is the file you want to analyze?\n'),'r').read())])

你可以将它压缩成一行,但这只是为了好玩!


0
import re

fl=open('regex_sum_7469.txt')
ls=[]

for x in fl: #create a list in the list
   x=x.rstrip()
   print x
   t= re.findall('[0-9]+',x) #all numbers
   for d in t: #for loop as there a empthy values in the list a
        ls.append(int(d))
print (sum(ls))

0

这是我对这个问题的解决方案。

import re

file = open('text_numbers.txt')
sum = 0 

for line in file:
    line = line.rstrip()
    line = re.findall('([0-9]+)', line)
    for i in line:
        i = int(i)
        sum += i    

print(sum)

第一个for循环中的行元素也是列表,我使用第二个for循环将其元素从字符串转换为整数,以便可以对它们进行求和。

0
import re
text = open('text_numbers.txt')
data=text.read()
print sum(map(int,re.findall(r"\b\d+\b",data)))

使用.read字符串格式获取内容。

0
import re
sample = open ('text_numbers.txt')
total =0
dignum = 0 

for line in sample:
    line = line.rstrip()
    dig= re.findall('[0-9]+', line)

    if len(dig) >0:
        dignum += len(dig)
        linetotal= sum(map(int, dig))
        total += linetotal

print 'The number of digits are:  ' 
print dignum
print 'The sum is: '
print total     
print 'The sum ends with: '
print  total % 1000

希望这对你有所帮助 :) - Max

0
import re
print(sum(int(value) for value in re.findall('[0-9]+', open('regex_sum_1128122.txt').read())))

3
虽然这段代码可能回答了问题,但提供关于为什么和/或如何回答问题的额外背景信息可以提高其长期价值。 - Pradeepal Sudeshana

0

这是我的代码:

f = open('regex_sum_text.txt', 'r').read().strip()
y = re.findall('[0-9]+', f)
l = [int(s) for s in y]
s = sum(l)
print(s)

另一种更短的方法是:

with open('regex_sum_text.txt', 'r') as f:
    total = sum(map(int, re.findall(r'[0-9]+', f.read())))

print(total)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接