2012-03-07 15 views
2

特定のフォーマットに従ったファイル内のすべての番号を見つける必要があります。形式は次のとおりです。特定のフォーマットの番号を見つける

各数字は正または負です(記号は存在していてもいなくてもかまいません。小数点の前には1つ以上の桁があり、小数点以下には1つ以上の桁があります)。小数点以下の桁はないかもしれません。各番号の前後にはスペースがあります。 2つの数字は、カンマ(、)またはセミコロン(;)またはコロン(:)で区切られています。例えば、 (35.3,52.23; -623,623.62:-52,65)

上記の例では、6つの数字があります。検索される数字のリストは括弧の間にある。今までのコードは次のようになりました。

def number_processing(file_location): 
    """""" 

    import re 

    file_variable = open(file_location) 
    lines = file_variable.readlines() 

    numbers = re.compile(r'[(] *[+]?[-]?[0-9][0-9]*[.]+[,]+[;]+[0-9][0-9]* *[)]') 
    numbers_list = [] 

    for line in lines: 
     for word in line.split(" "): 
      match = numbers.match(word) 
      if match: 
       numbers_list.append(match.group()) 
     print numbers_list 

何か助けていただければ幸いです。

答えて

6

str.splitを使用する必要はありません。ちょうどre.findallを使用するのはどうですか?

>>> s = '35.3 , 52.23; -623, 623.62 : -52,65' 
>>> re.findall(r'[-+]?\d+(?:\.\d*)?', s) 
['35.3', '52.23', '-623', '623.62', '-52', '65'] 

編集:内側のみ検索にがペアを括弧、あなたが最初にそれらを見つけるために、別の正規表現を記述し、その後、上記のものを再利用することができます。すべての参加するには

>>> s = '(23432.434 , 32423, -4343; 343) 5555 (3244, 45445; -4545)' 
>>> for s_ in re.findall(r'\(.*?\)', s): 
... re.findall(r'[-+]?\d+(?:\.\d*)?', s_) 
... 
['23432.434', '32423', '-4343', '343'] 
['3244', '45445', '-4545'] 

リスト内の上記のサブリスト:

>>> s = '(23432.434 , 32423, -4343; 343) 5555 (3244, 45445; -4545)' 
>>> pat1 = re.compile(r'\(.*?\)') 
>>> pat2 = re.compile(r'[-+]?\d+(?:\.\d*)?') 
>>> [x for s_ in re.findall(pat1, s) for x in re.findall(pat2, s_)] 
['23432.434', '32423', '-4343', '343', '3244', '45445', '-4545'] 
+0

Nifty答え。簡潔さのために+1:D – skytreader

+0

+1の優雅さ! – jathanism

+0

ご回答いただきありがとうございます。しかし、私はそれを少し微調整するのに助けが必要です、数字のセットはかっこのペアで閉じられます、ファイルに複数のセットがあるかもしれません。例えば、(23432.434,32423,4343,343)5555(3244,45445; -4545)。私は関数出力に5555を表示したくありません。再度、感謝します! – italianfoot

0

すでにスペース、正規表現のような何か...

[(]?[+-]?\d+\.?\d+[,;:]?[)]? 

(あなたは括弧をエスケープする必要がある場合はわからない...ちょうどチェックによって分割されているので、D

[ +]?[ - ]? - これは何?正規表現で+と - の両方が出現するかもしれませんが、一方または両方が存在しない可能性があります。

そして、あなたの正規表現全体は、2つの別々の数字を同時に認識しようとします(あなたがカンマ、セミコロン、コロンで意味するものを得た場合)。あなたが望むものを手に入れようとしない場合は、多くのテストケースがあります。あなただけのすべて検索したい場合は

/[\d.-]+/ 
0

数字は、何かのような何かをしないでください:

re.findall(r'[+-\d.]', text) 

余分な書式設定について心配しないでください?

(注:これは奇妙入力され、例えば+2323.と一致しますが、Pythonはそれに対処することができますが、

map(float, re.findall(r'[+-\d.]', text)) 

を行う場合、あなたはまだ山車の素敵なきれいなリストを取得します。)

0

:あなたは、グローバル式を実行し、貪欲、簡単な方法で数字、ダッシュ、および小数点を食べて、正規表現でこれらのトークンを単に消費する場合

関連する問題