import re
str='abc defg'
m1 = re.match(".*(def)?",str)
m2 = re.match(".*(def)",str)
print (m1.group(1),m2.group(1))
上記の出力は次のとおりです。
(なし、「デフォルト」)
何が起こっている?貪欲ではない繰り返し演算子を使用しても、オプションのキャプチャ グループ(def)?
は一致しません。
正規表現エンジンが と照合しようとすると、次のようになり.*(def)
ますabc defg
。
.*
は、最初は可能な限り何度でも一致を試み、文字列全体に一致します。(def)
これにより残りの一致が失敗するため、正規表現エンジンはに.*
一致する方法が見つかるまでバックトラックしabc
ます。ただし、正規表現を に変更すると.*(def)?
、代わりに次のようになります。
.*
次に、文字列全体を照合して、可能な限り何度も照合を試みます。(def)?
貪欲であるため、エンジンは可能であれば一致することを好みますが、可能かどうかを確認するためだけに以前のサブパターンをバックトラックするつもりはありません。代わりに、.*
文字列全体をむさぼり食うだけで、 には何も残しません(def)?
。.*?(def)
andでも同様のことが起こり.*?(def)?
ます:
.*?
しようとします。つまり、まったく一致しません。(def)
一致することはできませんが、(def)?
できます。したがって、正規表現エンジンは、完全なパターンが一致するものを見つけるまで、(def)
前に戻ってより長い一致を検討する必要がありますが、それを行う必要がないため、そうしません。.*?
(def)?
詳細については、Perl 正規表現マニュアルの「RE ピースの結合」セクションを参照してください(これは、Python の「Perl 互換」正規表現の動作と一致します)。