9
import re
str='abc defg'
m1 = re.match(".*(def)?",str)
m2 = re.match(".*(def)",str)
print (m1.group(1),m2.group(1))

上記の出力は次のとおりです。

(なし、「デフォルト」)

何が起こっている?貪欲ではない繰り返し演算子を使用しても、オプションのキャプチャ グループ(def)?は一致しません。

4

1 に答える 1

15

正規表現エンジンが と照合しようとすると、次のようになり.*(def)ますabc defg

  • まず、エンジンは文字列の先頭で正規表現との照合を開始します。
  • 貪欲なサブパターン.*は、最初は可能な限り何度でも一致を試み、文字列全体に一致します。
  • (def)これにより残りの一致が失敗するため、正規表現エンジンはに.*一致する方法が見つかるまでバックトラックしabc ます。

ただし、正規表現を に変更すると.*(def)?、代わりに次のようになります。

  • まず、正規表現エンジンが文字列の先頭から再び開始されます。
  • .*次に、文字列全体を照合して、可能な限り何度も照合を試みます。
  • しかし、その時点で、残りの正規表現はすべてオプションであるため、正規表現全体の一致が見つかりました! (def)?貪欲であるため、エンジンは可能であれば一致することを好みますが、可能かどうかを確認するためだけに以前のサブパターンをバックトラックするつもりはありません。代わりに、.*文字列全体をむさぼり食うだけで、 には何も残しません(def)?

.*?(def)andでも同様のことが起こり.*?(def)?ます:

  • 繰り返しますが、エンジンは文字列の先頭から開始します。
  • 貪欲でないサブパターンは、一致する回数をできるだけ少なく.*?しようとします。つまり、まったく一致しません。
  • その時点で、(def)一致することはできませんが、(def)?できます。したがって、正規表現エンジンは、完全なパターンが一致するものを見つけるまで、(def)前に戻ってより長い一致を検討する必要がありますが、それを行う必要がないため、そうしません。.*?(def)?

詳細については、Perl 正規表現マニュアルの「RE ピースの結合」セクションを参照してください(これは、Python の「Perl 互換」正規表現の動作と一致します)。

于 2013-01-02T02:16:50.800 に答える