2016-05-15 8 views
2

私はこのようになります。文字列のセット持っている:私は引っ張ってくる正規表現を記述しようとしているゴルディロックスの正規表現パターンを必要とする - あまりにも利己的な、あまりにも貪欲とないではない

lines_ = ["04/04  1,000.00 Some word132:11bdkljas  14235262634235", 
      "04/04  500.00 A simpler phrase   19058453049854", 
      "04/04 1,000,000.00 Apply//erklj//1324:123"] 

を文字列の最初の3つの "要素"。私はこの例に基づいて、単にre.split("\s{2,}")を使用して最初の3つの要素を取得することができますが、入力には常に2つ以上のスペースが必要であることを保証できません。だから私はむしろそれをつかむためのより堅牢な正規表現を持っています。

私はこれを使用してみました:数字のないセットがありませんので、最初の2つの要素のために動作しますが、第三ない

r"(\d{2}/\d{2})\s+([\d,]+\.\d\d)\s+(.+)(\s+\d+)" 

。それでは、私はこれにそれを微調整:

r"(\d{2}/\d{2})\s+([\d,]+\.\d\d)\s+(.+)(\s+\d+)?" 

これが三つ目のために動作しますが、最初の2のために、第3の要素の一部として、その4番目の要素を含んでいます。それでは、私はこのように見て、それをさらに微調整:

r"(\d{2}/\d{2})\s+([\d,]+\.\d\d)\s+(.+?)(\s+\d+)?" 

(.+)の内部?が、それはあまり貪欲にし、最後の要素を飲み込んでいないだろうと考えます。代わりに、それは私に3番目の要素の最初の単語の最初の文字を与え、それはそれです。私はで終わるしたい何

は以下のように出力されます。

groups_ = [("04/04", "1,000.00", "Some word132:11bdkljas"), 
      ("04/04", "500.00", "A simpler phrase"), 
      ("04/04", "1,000,000.00", "Apply//erklj//1324:123")] 

私は私の正規表現に欠けているものに何かアドバイスをいただければ幸いです。

答えて

1

使用mgのオプション

(\d{2}/\d{2})\s+([\d,]+\.\d\d)\s+(.+?)(?:\s+(\d+)|,|$) 

Demo

1

と、このパターンはどのようにあなたのためにこの作品?

import re 
lines_ = ["04/04  1,000.00 Some word132:11bdkljas  14235262634235", 
      "04/04  500.00 A simpler phrase   19058453049854", 
      "04/04 1,000,000.00 Apply//erklj//1324:123"] 

for i, line in enumerate(lines_): 
    match = re.search(r''' 
     (\d\d/\d\d) # eg: 04/04 
     \s+   # one or more spaces 
     ([0-9.,]+)  # digits, with commas and decimal points 
     \s+   # one or more spaces 
     (.*?)   # "everything else" (non-greedy) 
     (\s+\d+)?  # ... optionally followed by one or more 
         # spaces and a bunch of digits 
     $    # end of line 
    ''', line, re.VERBOSE) 

    if match: 
     print i, match.groups() 
    else: 
     print i, None 

私は次のような出力を得る上で実行します。

0 ('04/04', '1,000.00', 'Some word132:11bdkljas', '  14235262634235') 
1 ('04/04', '500.00', 'A simpler phrase', '   19058453049854') 
2 ('04/04', '1,000,000.00', 'Apply//erklj//1324:123', None) 
+0

興味深いです。私はこのアプローチを試してみましたが(カンマと小数の桁で少し違いましたが)、ここで見たように3番目の要素は見つかりませんでした(https://regex101.com/r/hL9nJ7/1)。 – brittenb

関連する問題