2016-06-15 5 views
0

私は初心者であり、Pythonを学んでいます。問題は、ファイルから数字を抽出しなければならないことです。数字はどこでもかまいません。同じ行で複数回使用できます。いくつかの行は数字を持たず、いくつかの行は改行かもしれません。私はそれを解決する方法を知っていましたが、これは私のコード正規表現を使用してファイルから数値を抽出し、その和を求める

import re 
new=[] 
s=0 
fhand=open("sampledata.txt") 
for line in fhand: 
    if re.search('^.+',line):   #to exclude lines which have nothing 
     y=re.findall('([0-9]*)',line) #this part is supposed to extract only the 
     for i in range(len(y)):  #the numerical part, but it extracts all the words. why? 
      try: 
       y[i]=float(y[i]) 
      except: 
       y[i]=0 
     s=s+sum(y) 
print s 

コードが動作したが、それはそれを行うにはニシキヘビの方法ではありません。 ([0-9] *)が数字だけでなくすべての単語を抽出するのはなぜですか? これを行うにはどうしたらいいですか?

+0

デバッグのヘルプを求める質問(** "なぜこのコードは機能していないのですか?")**は必要な動作、*特定の問題やエラー*、* *を再現するのに必要な*質問自体**。 **明確な問題文**のない質問は他の読者には役に立たない。参照:[最小限で完全で検証可能な例を作成する方法](http://stackoverflow.com/help/mcve) – MattDMo

答えて

0

あなたの正規表現は([0-9]*)です。のすべての単語がゼロ以上の数字を見つけることができます。おそらく([0-9]+)が代わりに必要です。

0

これは動作するはずのようにあなたは、「*」を追加することにより、正規表現でミスを犯したこんにちは:wind85の答えに拡大

y=re.findall('([0-9])',line) 
+0

理由を説明できますか? – stick

+0

@stick []はセットを示し、[0-9]は0から9の範囲のセットを示し、繰り返しがあっても文字列内のすべての数字と一致します。 – wind85

0

を、あなたは微調整にどのような種類に応じて、あなたの正規表現をお勧めしますあなたのファイルで見つかると思われる数字の数。たとえば、数字に小数点が含まれている場合は、[0-9]+(?:\.[0-9]+)?(1つ以上の数字の後にピリオドと1つ以上の数字が続いてもかまいません)が必要です。それはより多くのニシキヘビ作るためとして

は、ここで私はおそらくそれを書くだろう方法は次のとおりです。

print sum(float(y) for line in open('sampledata.txt') 
        for y in re.findall(r'[0-9]+',line)) 
:あなたが本当に空想を取得したい場合は

s=0 
for line in open("sampledata.txt"): 
    s += sum(float(y) for y in re.findall(r'[0-9]+',line)) 
print s 

、あなたはそれをワンライナーを作ることができます

しかし、個人的に私はその種のものを読むのが難しいと思う。

関連する問題