2016-04-12 12 views
1

私の正規表現が機能していないのは不思議です。それが働く唯一のグループは年です。 残りのグループはなしです。正規表現が書かれている1991年5月 グループ内のグループとRegexが連携していない

  • 10 1991年5月
  • formatted_date = re.search('.*((?P<day>\d{1,2}))?((?P<month>[a-zA-Z]+))?(?P<year>\d{4}).*', '10 may 1991') 
    

    正規表現の背後にある考え方は、それが次の入力で動作するということですPythonで。事前に

    感謝:)

+0

開始時にドットと怠惰なマッチングを使用する: '。*?'、しかし私はあなたがそれを必要とするとは思わない。 –

+0

ありがとうWiktor !!!私は怠惰なマッチングについて決して忘れることはありません – Miriam

答えて

2

問題は、パターンの先頭に貪欲ドットマッチングサブパターンが最後までのすべての文字をつかみ、そしてそれは他のために対応するために得るために持っているものを得後戻りするということですサブパターン。最初の2文字はオプションなので、テキストは与えられません。

.*のようにre.searchに完全な文字列の一致を必要としないためです。

使用

(?:(?P<day>\d{1,2}))?(?:(?P<month>[a-zA-Z]+))?(?P<year>\d{4}) 

私はまた、マッチオブジェクトがビットクリーナーとなるように、非撮影する任意の基を取り込む変換regex demo

を参照してください。

あなたはまだあなたのアプローチを使用している場合、あなたはパターン(怠惰なドットマッチング)の先頭に.*?を使用して検討するかもしれないが、あなたはその後、改行を心配しなければならないことに注意してください(OK、あなたはそれを解決するためにre.Sフラグを使用することができます1)、そしてその方法では、の最初のインスタンスを文字列に入れます。複数ある場合は、最後のものを取得する必要がありますが、最良の方法は、提案されたパターンにre.findallを使用して、結果のリストの最後の要素を取得することです。

+1

ありがとう! Regexは私にとって今より多くの意味があります。私が望むことができる最高の答え:) – Miriam

関連する問題