2012-02-25 12 views
3
は、ここで私の最初の時間は、タイトルは私が:)

複数の同じ名前のグループの定義やシステム

まあを知っている悪いです

、これは私が何をしようとしているある場合

入力可能性1:SOMETHING BLAH always same words here (here comes date/time text, called group 1) [group 2 text]: (group 3 text) END

入力2:SOMETHING BLAH [group 2 text] always same words here (here comes date/time text, called group 1): (group 3 text) END

グループ2は、Pythonおよびモジュールの再を使用して、前または今

後に現れることができ、eitheを一致させることも可能ですこれらの入力の1つだけ正規表現を使用して?

例は(もちろん、このようなものは、同じ名前のグループが含まれているとことはできません):

"SOMETHING BLAH (always same words here \((?P<group1>.{1,40})\) \[(?P<group2>.*?)\]: \((?P<group3>.*?)\)|\[(?P<group2>.*?)\] always same words here \((?P<group1>.{1,40})\): (group 3 text)) END", re.DOTALL 

それは、オプションのグループを使用しているものイム

+0

場合は、それを固定検討します。これはちょうど正規表現のグループ名です。実際の質問に実際に反映されるようにタイトルを変更することを検討してください。 –

+0

なぜそれは '明らかに不可能'ですか?それが本当ならば、それは本当にばかげた制限だろう。あなたはいつもPerlでこのようなことをしています。実際、あなたのパターンは正確な構文でPerlでうまくコンパイルされます。 PythonのMatthew Barnettの 'regex'モジュールを見ましたか?私はここにあなたを助けるブランチリセット操作があると信じています。 – tchrist

+0

はPythonでは使用できませんでした。他のいくつかの言語は、はい、.NETのように聞いたことがあります。恐ろしいことが現時点では、このようなことがPython 3.0で可能であるかどうかわからない – Intelligence404

答えて

0

確かにやろうとしているためだけのexmpです。多少長さのために単純化

>>> patt = re.compile("foo (?P<name>[0-9]+)?") 
>>> patt.search("blah foo 999 bar").groupdict() 
{'name': '999'} 
>>> patt.search("blah foo bar").groupdict() 
{'name': None} 

あなたの例、:

prefix (?P<optional1>\[.*?\])? same-words \((?P<date>.*?)\)(?P<optional2> \[.*?\])?: \((?P<g3>.*?)\) END 

は、その後、あなたが試合をしたら、あなたが行うことができます。タイトルは悪いです

d = patt.search(str).groupdict() 
g2 = d["optional1"] if d["optional1"] is not None else d["optional2"] 
+0

遅れて申し訳ありませんが、このソリューションのおかげで、もう1つのテストを使用するのは嫌ですが、現時点で他の方法はありません私はこれで行くつもりです。ありがとう – Intelligence404

関連する問題