2017-08-06 83 views
4

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

由於「東西」名單中還包括空空間(線在沒有數字)和,我想我需要嘗試「」 /用於防止回溯錯誤的行除外。有沒有更簡單的方法來實現這個程序,沒有第二個循環?

+0

你爲什麼加上'。 '如果你想解析整數? –

+0

你也試圖總結浮點數嗎? –

+0

你的正則表達式不正確。您的模式將匹配一個或多個數字零至九個_ **或** _一個或多個小數字符。你可能想要的東西更像這樣:'\ d +(。\ d +)?'。 –

回答

2

我不明白爲什麼你把點.放到你的正則表達式中,因爲你的代碼和示例數據都表明(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/'一個片段,而這將解析'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