2017-12-01 9 views
1

キーワードの後に​​1から3ワードをキャプチャしようとしていますが、一部のケースですべての単語が返されません。ここでは3例の文字列と予想される出力されていますキーワードの後に​​1から3ワードを取り出すためにPython正規表現を使用する

  • [ '5Hの1メートルの2S']に "5H 1メートルの2Sを待つ" "
  • [ '5Hさ1m']に "5時間の1メートルを待ちます" 1mを[1m]に設定してください。

例の文字列が複雑な行の一部である可能性があるため、正規表現を使用しようとしています。これは私のコードです:

In [51]: ex = re.compile('wait (?:A\s)?(\w+\s?\w+?\s?\w+?\s?)', re.IGNORECASE) 

In [52]: ex.findall("wait 5h 1m 2s") 

Out[52]: ['5h 1m '] 

In [53]:ex.findall("wait a 5h 1m") 

Out[53]: ['5h 1m'] 

In [54]: ex.findall("wait 5h") 

Out[54]: [] 

なぜ、正規表現は「待機」と2つのオプションの単語の後に単語を捕捉しませんか?

答えて

0

問題はこの部分である:

\w+?\s?\w+? 

\w+?の発生は、非欲張りなので、効果的に、彼らは「できるだけ少ない単語の文字を取る(ただし、少なくとも1つの)」を意味します。オプションのスペース(\s?)を入力すると、最初に\w+?と一致するものが表示されます(たとえば、"1")。省略可能なスペースはスキップされ、その後"m"に一致するのは\w+?です。したがって、効果的に1mは2つの "単語"として解釈されます。

これは{}反復表記のための良好なアプリケーションであろう:

>>> ex = re.compile('wait (?:A\s)?((?:\w+\s*){1,3})', re.IGNORECASE) 
>>> ex.findall("wait 5h 1m 2s") 
['5h 1m 2s'] 
>>> ex.findall("wait a 5h 1m") 
['5h 1m'] 
>>> ex.findall("wait 5h") 
['5h'] 

{1,3} "は、この1-3倍に一致する" を意味します。それぞれの単語の文字を貪欲に捉えているので、「オプションの」スペースを\s*として提供することで、後ろのスペースが足りないことがないようにすることができます。

関連する問題