2016-04-25 3 views
3

私は、グループがオプション?であっても、それがまだ欲張りであり、の場合は、の場合は正規表現の次の部分に行く前にそれを消費すると考えました。私のオプションのグループが欲張っていないのはなぜですか? /(5)?.*/

私は(5).*対簡素化正規表現(5)?.*(グループ1 ないオプション)を指定すると、私はまったく同じ文字列を使用して同じ動作を期待していても、Pythonの2.7.6で異なる動作を参照してください。

>>> import re 
>>> s = 'before [5.5s] after' 
>>> r = re.compile(r'(5)?.*') 
>>> print r.search(s).groups() 
(None,) 

>>> r2 = re.compile(r'(5).*') 
>>> print r2.search(s).groups() 
('5',) 

私は何を得ていないのですか?なぜ最初の正規表現rは5を吸い取っていないのですか?

注:私はこの特定の正規表現は、私を助けにはなりませんを解決するための試みとして、なぜの理論を必要とします。これはSSCCEです。私はより複雑な正規表現を持っています。私は実際にはについての知識のギャップを埋めることを望みます。なぜなら、というオプションのグループは、私が思っていたほど貪欲ではありません。

+6

'(5)?'は空の文字列にマッチすることができ、正規表現エンジンは文字列を左から右に解析するので、 '(5)?'は文字列と '。*'は残りの行と一致します。 –

+0

また、 're.compile( '(。*)(。*)')。search( 'abc')。groups()は' 'abc '、' ')を生成します。なぜなのかご存知ですか? –

+0

'search'は文字列の先頭からマッチングを開始します。一致した場合(これらの場合のように)、他の開始インデックスは考慮されません。 – myaut

答えて

4

まず例:

  • あなたの正規表現は全体文字列sと照合されます。
  • したがって、「B」あるsの最初の文字は、一致をもたらさない(5)?、照合されます。しかし、(5)?のオプションのパターンの一部であるため、正規表現エンジンはそれを0回一致させ、パターンの現在の位置を進め続けます。
  • 残りの文字列は残りのパターンと一致します。したがって、文字列全体が一致します。しかしグループ(5)自体は何もマッチしませんでしたので、最初の例ではNoneが表示されています。

第二の例:5

  • がもはや任意であるので、潜在的にマッチする文字列の最初の文字は、"5"なければなりません。したがって、"5"の後に"[]の後に一致する可能性があります。
  • マッチするには、残っている文字列が残りのパターン.*と一致する必要があります。

一般に、using the greedy .* is almost never what you wantに注意してください。

+0

記事は興味深いですが、タイトルは常に最悪です。 –

+0

@CasimiretHippolyte私はお詫び申し上げます。 ;) –

+0

おっと、あなたのものです、ごめんなさい。つまり、タイトルが貪欲な量限定子を避けなければならないという仮定につながる可能性があるということです。怠惰な数量化を避ける方法についての記事を書くべきです! –

関連する問題