2016-07-13 11 views
2
op = ['TRAIL_RATE_ID 8 TRAIL_RATE_NAME VC-4 TRAIL_ORDER High Order ', 'TRAIL_RATE_ID 9 TRAIL_RATE_NAME VC4-4 TRAIL_ORDER High Order ' , 'TRAIL_RATE_ID 10 TRAIL_RATE_NAME VC-8 TRAIL_ORDER High Order '] 
word = "8" 
for op1 in op: 
    pp=re.search('(\\b'+word +'\\b)', op1, flags=re.IGNORECASE|re.DOTALL) 
    print bool(pp) 

は、私はそれが最初のオカレンスだけを一致させたい8.文字列内の正確な単語をどのように一致させるか?

の2回の出現に一致します。単語は単語 =「8」 単語=「$#HHD」 単語=「こんにちはこんにちは」私はこの使用して正規表現に一致するにはどうすればよい

することができますか?

+2

ないdownvoting!これはよく聞かれる質問です。 –

+0

さて、最初に間違っていた最も厄介な解決策を受け入れました。私はむしろ[私のより単純なソリューション](http://stackoverflow.com/a/38357592/3832970)(適切なソリューションが最初に提供された)を使用したいと思います。また、私の解決策は 're.M'フラグに依存しません。 –

答えて

4

あなたが単語の両側に非空白記号があってはならないことを要求することができます

r'(?<!\S){0}(?!\S)'.format(re.escape(word)) 

regex demo

を参照してください、私はあなたのキーワードがあるべき特別な正規表現のメタ文字が含まれている場合にはre.escape(word)を追加しました文字通りに扱われる。

Python demoを参照してください:今日のため

import re 
word = "8" 
pat = r'(?<!\S){0}(?!\S)'.format(re.escape(word)) 
print re.search(pat,"nnn 8", flags=re.IGNORECASE) 
+0

また、Pythonで正規表現パターンを定義するときに生の文字列リテラルを使用します。 –

+1

これは正解でなければなりません。 'Python'は**固定幅** lookbehind(+1)しかサポートしていません。 Wiktorのソリューションの詳細については、[** The double negative delimiter **](http://www.rexegg.com/regex-boundaries.html#double-negative-delimiter)を参照してください。 – Jan

+0

@Jan:さらに、内部の別の分岐見た目は同じ長さでなければならない。 '(?<= \ s | \ d)'が動作します。 –

4

-は単語キャラクタと見なされないため、ワード境界は役に立ちません。

あなたは前後参照を使用することができます。

p = re.compile(r'(?:(?<=^)|(?<=\s))' + word + r'(?=\s|$)', flags=re.IGNORECASE|re.M) 
re.search(p, op1) 

Code Demo

  • (?<=^)|(?<=\s)は、私たちの言葉
  • (?=\s|$)たちはラインを持っていることを確認するために先読みある前に、我々はライン開始または空白を持っていることを確認するために後読みです末尾に空白があります。
+1

この答えが何回取得されたかにかかわらず(re.search( '(?<= \\ s | ^)' + word + '(?= \\ s | $)'、op1、flags = re.IGNORECASE | re .M) ')、正しいとは限りません。 upvotingの前にチェックしてください。さもなければupvoting/downvotingの全ポイントは無意味です。 –

+0

はい、あなたはWiktorです。今修正されました。申し訳ありませんが、会議に出席するために踏み出す必要がありました。私はpythonの中心的な開発者ではなく、regex101コードジェネレータによってだまされました:) – anubhava

関連する問題