7

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

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']

それは私が望むように機能しますが、それを行うための最良の方法ではないと思います。誰かが私を助けることができますか?

4

3 に答える 3

7

re.findall重複する一致が見つかりません。正規表現を使用する場合は、2番目の例のように、個別の式を作成してループで実行する必要があります。

2番目の例も次のように短縮できることに注意してください。ただし、これが読みやすいかどうかは好みの問題です。

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

特定の例では、正規表現を使用する必要はありません。固定文字列を検索するだけの場合は、正規表現の使用を避ける必要があります。

于 2012-12-25T19:00:02.793 に答える
6

re.findallhttp://docs.python.org/2/library/re.htmlで説明されています

「文字列内のパターンの重複しない一致をすべて返します...」

重複しないとは、「ドイツビール」の場合、「ドイツビール」と「ドイツ」が重複しているため、これらの一致が見つからないことを意味します。

于 2012-12-25T19:04:34.320 に答える
1

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

results = []
for key in keywords:
    results.extend(re.findall(key, message, re.IGNORECASE))
于 2012-12-25T19:32:58.280 に答える