2017-01-13 6 views
0

存在しない可能性のある単語に一致する正規表現に一致させたい。私はpython regexが可能な単語に一致する

少しするlineを設定した場合

import re 

line = "a little boy went to the small garden and ate an apple" 


res = re.findall("a (little|big) (boy|girl) went to the (?=.*\bsmall\b) garden and ate a(n?)",line) 

print res 

が、これの出力も出力され

[] 

です:私はこのような何かを試してみてくださいそのhereを読みます少年は庭に行ってりんごを食べた。

可能な単語が存在するかどうか、またはテキストに存在しない場合はどうすればよいですか?

+2

疑問符数量詞 ''ゼロ一致するかのいずれかが与えられましたの?パターン。 (小さな)庭への正規表現は、「庭へ」と「小さな庭へ」[DEMO](https://regex101.com/r/RDfCYm/1) –

+2

の両方にマッチします.findall(r "a(little | big)(boy | girl)は\ bsmall \ b){0,1}ガーデンに行き、(n?)"行を見た。文字列の'r'がなければバックスラッシュが解釈されます。 ''\ b''はバックスペース文字です。 'r '\ b''はバックスラッシュで、その後に" b "が続きます。 –

+1

実際に '(?=。* \ bsmall \ b)ルックアヘッドは、現在の位置の後ろのどこかに、行区切り記号以外の0以上の文字の後ろに' small'という単語が存在することを必要とします。だから、「庭」である必要はありません。それでも、消費パターンが必要です。スティーブンはそうです。とにかく、 '\ b'のパターンは生の文字列リテラルで宣言しなければならないか、円記号を二重にする必要があります。 –

答えて

2

まず、と一致するのはで、「小さい」単語だけでなく、その後(またはその前に)スペースも必要です。だからこのような正規表現を使用することができます:(small)?。 一方、をキャッチするだけです。あなたは、このように正規表現を使用する必要がありますキャプチャから試合を除外するには:(?:(small))?

全例:

import re 

lines = [ 
    'a little boy went to the small garden and ate an apple', 
    'a little boy went to the garden and ate an apple' 
] 

for line in lines: 
    res = re.findall(r'a (little|big) (boy|girl) went to the (?:(small))?garden and ate a(n?)', line) 
    print res 

出力:

[('little', 'boy', 'small', 'n')] 
[('little', 'boy', '', 'n')] 
+0

すごく、ありがとう! 質問:なぜ、このパターンは、 "小さな"大きな(男の子か女の子か)小さな庭に行って、 ' – Yotam

+0

ありがとう:)この正規表現では、次のような行をキャッチしようとしているので、うまくいきません:' ['小さなお子さんは小さな庭に行ってリンゴを食べました、'小さな男の子が園に行ってリンゴを食べました'] '。 「the」の後にスペースがありません。 – vasi1y

関連する問題