2016-06-26 5 views
0

"="の前後の単語を見つけるために、以下のレイジー正規表現を使用しています。私はなぜレイジー正規表現は余分な単語をキャプチャしますか?

JIL私はここで何か間違ったことをやっているか、私にできること=だから私は名前をキャプチャしたい

my name = jil 
part = #2 

テキスト形式で

ある理由、それは余分な言葉

r'\s+(.*?)\s+\=\s+(.*?)\s+' 

をキャプチャすることを確認していませんそれは違う方法で。

注:前と後に「=」私たちは、あなたが探している特殊文字

+0

あなたは '\ s +(。*?)\ s + \ = \ s +(。*?)$'が必要だと思うので、2番目のキャプチャグループにアクセスする必要があります。 '\ s'を強制しています。 – rock321987

+0

機能を使用していますか? 're.search(your_regex、" my name = jil smith ")'は 'name'と' jil'を取得します。 – chepner

+0

@chepnerそれは 'reに失敗します。あなたの例では、 'my'の前または' smith'の後ろに空白がないので、search(your_regex、 "my name = jil smith") 'のように動作します。 – TemporalWolf

答えて

2

持つことができます。 (\S+)\s*\=\s*(\S+)

\Sマッチ非空白をし、キャプチャグループに./\#@&、などが可能になります。

\w試合のみの単語の文字を、あなたが\s+

\s*にを変更した場合、それがない理由これは=の間に空白の有無にかかわらず、equalsメソッドおよび後の最初の単語の前に最後の単語と一致しました仕事はそれを左から右に解析するからです。空白の量が見つかったら \s+ .*?の文字はすべて " ="になるまで吸い始めます。したがって、空白文字の後ろの " ="より前の行全体と一致します。

遅延評価は、それができる最小のセットを見つけるために戻っていない、それは最初の完全な一致に達すると停止するまで、それだけで行く:

dog dog dog dog = cat cat cat cat 

\s+(.*?)\s+= の怠惰なキャプチャができます:私たちをdog dog dog最初の犬の後に" "から始めて、最初の犬の後に始まり、最初に" ="が見つかるからです。 2番目のグループは、等号の付いたスペースで終了するという余分な要件がないため、期待したことを行います。

=の後に、遅延は、それがマッチを得る最初のポイントであるため、最初の単語だけに制限されます。欲張りなバージョンでは、文字を吸い続けて、最後に長い文字列を見つけるのは\s+です。

tl; dr:遅延評価は最小一致を見つけるために戻ってこない、左から右に解析するときの最初の一致を取得する。それはogで最初dに一致するように、他のすべてのd Sをガツガツするために、必要に応じてd+?ogは、それの全体がddddddogにマッチしますし、それが戻って、それは本当にすべてのそれらの余分な文字を食べるのに必要かどうかを確認するために、あまりにも怠惰です。

+0

前後の単語は '。'のような特殊文字を持つことができます。 、 '#' '&' @TemporalWolf – user6513847

+0

そして、空白以外に '\ S'を使います。私は私の答えを更新します – TemporalWolf

+0

私は正しい答えをマークしました。日曜日の朝に2時間苦労してきたみなさん、ありがとう – user6513847

関連する問題