2017-12-27 22 views
1

私は正規表現ライブラリが、それは「プロジェクトのではなく「仕事」を含んでいる場合と一致していのpython負の検索

string = ''' 
     making the regex for project 
     is the basic work ''' 

として文字列を持っています。

私はこのようにそれを書いた:

bool(re.search('project.*(?!work)')) 

それが見つかったとして、それが真を返しています。しかし、それは偽を返す必要があります。怠惰や貪欲数量詞と定量化されたパターンの後に負のlooksaheadを置く

+0

['' project 'が' s 'に、' work 'が[s']でないのはなぜですか(https://ideone.com/n3Er0w)?ところで、正規表現は ''(?​​!)プロジェクト(?!。*仕事)で簡単に修正できます' –

+0

しかし、私のコードには多くの正規表現があり、指定されたものを検索する関数が1つしかないので、引数(re)を返し、存在に応じてtrue/falseを返します。 –

+1

この質問は修正が必要です。 sea [r] chへの呼び出しの例は、コンパイルされたreであり、REのような文字列が渡されているため、「sting」でなければならないか、モジュールレベルの呼び出しであり、検索される文字列を第2のパラメータとして渡す。 – Nick

答えて

4

ほとんどないので、バックトラックの期待される結果が得られます。.*マッチ一度は0+何workがないので、それは先読みパターンをチェックし、改行の文字以外の文字最初の行の最後の直後に、結果はです。正規表現を修正するには

、あなたは必ず.試合の改行文字を作る(re.DOTALL修飾子を渡すか、開始時に(?s)を追加)し、先読みに.*を移動する必要があります。

re.search(r'project(?!.*work)', s, re.DOTALL) 

regex demoを参照してください。

このパターンの意味は、projectを検索し、0以上の文字の後にcheck部分文字列がある場合は一致しません。

この正規表現をそのまま使用する予定の場合は、if 'project' in s and 'work' not in sを使用して同じことを確認する方が理にかなっていることに注意してください。

+0

それは働いた。ありがとう!!! –

+0

この回答は、実際には 'project'が含まれていて 'work'が含まれていない場合、一致するための要件を実際に満たしていません。たとえば、s = 'work is not project'の場合はtrueを返します。 – Nick

+0

@ニックオリジナルの正規表現は、 'project'の後に' work'がある場合にのみマッチを失敗することを意図していました。それ以外の場合、正規表現を使用する意味がありません、非正規表現の解決策は私の答えでも提供され、それは 'プロジェクト'を持っていて、 '仕事 'を持っていない文字列をチェックします。 –