2009-09-10 1 views
18

プログラムの出力ログに正規表現マッチ(Pythonで)を行いたいと思います。グループの数が不明なグループに正規表現を一致させる方法

... 
VALUE 100 234 568 9233 119 
... 
VALUE 101 124 9223 4329 1559 
... 

私はVALUEで始まる行の最初の発生後に発生した番号のリストをキャプチャしたいと思います:ログには、次のようになり、いくつかの行が含まれています。すなわち、私は('100','234','568','9233','119')を返すようにしたい。問題は、あらかじめいくつの番号があるかわからないということです。

私は正規表現としてこれを使用しようとしました:

VALUE (?:(\d+)\s)+ 

(「119」)これは、行と一致したが、それは唯一の最後の値をキャプチャし、私はちょうど得ます。

+1

前の質問に基づいて、私は正規表現では不可能と思っています:http://stackoverflow.com/questions/464736/python-regular-expressions-how-to-capture-multiple-groups-from-a -wildcard-expre#464755 –

答えて

16

正規表現の一致ではなく、パーサーです。

s = "VALUE 100 234 568 9233 119" 
a = s.split() 
if a[0] == "VALUE": 
    print [int(x) for x in a[1:]] 

をあなたの入力ラインがすることができます、その後、(あなたの質問で正規表現を使用して)あなたの予想形式と一致するかどうかを確認するために正規表現を使用することができます:あなたのケースでは、私はsplit()、非常に単純なパーサを使用して検討します"VALUE"を確認せずに上記のコードを実行し、次の文字グループがすべて数字であることを既に確認しているので、int(x)の変換が常に成功することがわかっています。

2

あなたはちょうどあなたが番号を取得するために、これらの一致に二次の正規表現を実行し、その後メインマッチ正規表現している実行することができます:あなたは完全なパーサを書きたくない場合は

matches = Regex.Match(log) 

foreach (Match match in matches) 
{ 
    submatches = Regex2.Match(match) 
} 

これももちろんです。

キーワード「VALUE」は、文字列の先頭に表示されていることを検証しませんし、項目の間に1つのスペースが正確にあることを検証しませんが、あなたは別個のものとしてそれを行うことができれば
+2

これはどのプログラミング言語ですか? –

9
>>> import re 
>>> reg = re.compile('\d+') 
>>> reg.findall('VALUE 100 234 568 9233 119') 
['100', '234', '568', '9223', '119'] 

ステップ(またはそれを全く必要としない場合)は、任意の文字列内のすべての数字シーケンスを検索します。

2

ここに記載されていない別のオプションは、一連のオプションのキャプチャグループを持つことです。

VALUE *(\d+)? *(\d+)? *(\d+)? *(\d+)? *(\d+)? *$ 

この正規表現は、スペースで区切って最大5桁のグループをキャプチャします。より多くの潜在的なグループが必要な場合は、単に*(\d+)?ブロックをコピー&ペーストしてください。

0

私はこの同じ問題を抱えていたし、私の解決策は、2つの正規表現を使用することでした:サブグループを解析するために、私はに興味が全体群と第2のいずれかに一致する最初のものを。 [0]行全体、[1]の値後のものは[2]最後のスペース+値:これは3つの試合になるはずである

VALUE((\s\d+)+) 

:この場合例えば、私はこれで始まると思います。

[0]と[2]は無視することができ、その後、[1]以下で使用することができます。

\s(\d+) 

注:これらの正規表現は試験しなかった、私はあなたががアイデアを得る願っています。解析の第二の部分は、より複雑ではなく、単にいくつかの数字をスペースで区切っているため


Greg's answerは私ため動作しない理由はあります。

しかし、私は正直なところ、この質問のためにGregの解決策を考えています(おそらく効率的です)。

誰かが私のようにもっと洗練されたソリューションを探している場合に備えて、この回答を書いています。

関連する問題