2017-09-22 2 views
2

*は0以上を意味し、?のような貪欲でないオペレータと使用しない限り、常に可能な限り貪欲になります。正規表現でアスタリスクを使用すると、キャレット記号が欲張りにならない理由

>>> re.search('.*hello','hai hello there, hello again').group() 
'hai hello there, hello' 
>>> re.search('.*?hello','hai hello there, hello again').group() 
'hai hello' 

私はちょうど次のコードに遭遇し、動作を見るには少し驚いた。パターン\^*

>>> re.search('\^*','abc^').group() 
'' 
>>> re.search('a*','abc^').group() 
'a' 

、私はそれは、文字列中に存在する1つのキャレット記号と一致すると予想。

しかし、それは空の文字列が一致すると、キャレット記号の0が発生して終了することにより、非貪欲に動作しなければならない理由は? ^が正規表現に特別なので

はそれですか?だから、どうすれば^*のシンボルを一致させることができますか?

注:もちろん、\^+のパターンでは、明らかに文字のキャレットシンボルと一致します。

+0

文字列は左から右に解析され、したがって、あなたの '\は^ *'スタートと 're.search'リターンで空の文字列に、この最初の出現のみにマッチします。 –

+0

@WiktorStribiżew:Gr8 !!! 're.search( 'a *'、 'bca ^')。group()'で、空の文字列も返します。エンジンは最初に 'b'文字を解析し、一致するものがゼロで終了します。ありがとう:) – Dinesh

+0

検索されたパターンが最初の文字で始まっていない場合、アスタリスクは非貪欲な動作をしますか? – Dinesh

答えて

1

正規表現エンジンは、このように、あなたは\^*開始時に空の文字列に一致し、re.searchが最初に返し、左から右に入力文字列を解析し、発生のみ。

何かを検索するときは、空の文字列と一致する可能性のあるパターンを使用しないでください。\^*は、0以上の^シンボルに一致するパターンです。したがって、最も良い解決策は*の代わりに+を使用することです。

0

@WiktorStribiżewは、re.searchは最初の一致のみを返すと説明しました。 So:

  1. re.search( '\^*'、 'abc ^')。グループ(空の文字列を返します。つまり、文字列の先頭にあるキャレット記号の0倍に一致して返されます。
  2. re.search( '*'、 'ABC ^')。グループ()文字列の初めに1 aと一致し、このa
  3. re.search( 'B *を'、retrun 'ABC ^' ).group()は、キャレットと同じ理由で空の文字列に一致します(ケース1)

質問に「どのように一致させることができますか?あなたはグループ(\^+)*を使用して、グループの結果を得ることができます

re.search('(\^+)*','abc^^ab').group() 
関連する問題