2012-12-25 10 views
6

正規表現を使用して他の文字列で文字列を検索しようとすると、期待通りに機能しません。次に例を示します。Pythonで正規表現を使用して文字列を検索する

import re 
message = 'I really like beer, but my favourite beer is German beer.' 
keywords = ['beer', 'german beer', 'german'] 

regex = re.compile("|".join(keywords)) 
regex.findall(message.lower()) 

結果:

['beer', 'beer', 'german beer'] 

しかし、期待される結果は次のようになります。

['beer', 'beer', 'german beer', 'german'] 

それは可能性が行う別の方法:

results = [] 
for k in keywords: 
    regex = re.compile(k) 
    for r in regex.findall(message.lower()): 
     results.append(r) 

['beer', 'beer', 'beer', 'german beer', 'german'] 

私の望むように働くが、それはnだと思うそれを行う最善の方法。誰かが私を助けることができますか?

答えて

6

re.findall重複する一致が見つかりません。正規表現を使用する場合は、別の式を作成し、2番目の例のようにループで実行する必要があります。それはあなたがこれをより読み見つけるかどうかは好みの問題ですけれども、あなたの第二の例はまた、以下に短縮することができる

注:

results = [r for k in keywords for r in re.findall(k, message.lower())] 

あなたの具体的な例は、正規表現を使用する必要はありません。固定文字列を検索するだけの場合は、正規表現を使用しないでください。

+0

質問者のみ、特定のサブストリングは、文字列の一部であるかどうかをテストしたいが、彼は、特定のサブストリングのすべての出現を望んでいません。この場合、 're.findall()'を使うのがこれを実現する最善の方法です。正規表現を避けると、この解決策は必要以上に面倒になります。 – pemistahl

+0

お返事ありがとうございます。今私は間違った関数(findall)を使用していることを知っているので、重複を含む一致を見つけるために何をお勧めしますか? –

+0

@Adrián:正規表現の力が必要か、固定文字列を探したいだけですか? –

6

re.findallhttp://docs.python.org/2/library/re.html

に記述されている「文字列のパターンがすべての重複しないマッチを返す...」

非重複は、「ドイツビール」のために、それは「ドイツビール」を見つけられないことを意味しますAND "ドイツ語"、これらの一致が重複しているためです。

+0

返事ありがとうございますOmri Barel。オーバーラッピングを含む一致の検索にはどのようなことをお勧めしますか? –

+0

一般的に、一度に1つのキーワードを実行する必要があります。しかし、より良い解決策を得るには、実際に何をしようとしているのか(つまり、簡単な例に単純化せずに実際の状況は何か)を記述する必要があります。 –

+0

オムリ、私が答えを書いているように、私はそれを行うには最適かつ最適な方法だと思っていたので、私は正規表現について尋ねました。見つかった文字列は常に固定されます(word1 | word2 | word3 ...)、私は複雑な正規表現を意味しません。 –

1

マイクリーナー(私にとっては)あなたの最後の解決策のためのバージョン

results = [] 
for key in keywords: 
    results.extend(re.findall(key, message, re.IGNORECASE)) 
関連する問題