2013-03-15 13 views
6

コンパイル済みの正規表現を使用してリスト内のすべての単語を一致させて削除しようとしていますが、単語内での出現を避けるために苦労しています。でPythonリストから文字列内の単語をすべて削除します

REMOVE_LIST = ["a", "an", "as", "at", ...] 

remove = '|'.join(REMOVE_LIST) 
regex = re.compile(r'('+remove+')', flags=re.IGNORECASE) 
out = regex.sub("", text) 

が出

を "速い茶色のキツネがアリを飛び越えた":

現在期待

を "速い茶色のキツネは、トンを飛び越えた":"クイックブラウンキツネが飛び越えた"

私はにコンパイルする文字列を変更しようとした以下のが、無駄に:

regex = re.compile(r'\b('+remove+')\b', flags=re.IGNORECASE) 

任意の提案や、私は派手明らかに何かが足りないのですか?

+0

おそらく 'ant'はあなたの一部です。リストを削除しますか? –

答えて

8

1つの問題は、最初の\bが生の文字列内にあることです。 2番目の文字は、単語境界ではなく、バックスペース文字(ASCII 8)として解釈されます。ここ

regex = re.compile(r'\b('+remove+r')\b', flags=re.IGNORECASE) 
           ^THIS 
+1

これを発見するための秘訣として(これを事前に知っていることは別として)、 'regex.pattern'でパターンを出力してください。 – nhahtdh

+0

素敵なNPE。ありがとう! – Ogre

16

regex = re.compile(r'\b('+remove+')\b', flags=re.IGNORECASE) 

を変更、修正するには

はあなたが検討する必要があります正規表現を使用せずに提案です:

>>> sentence = 'word1 word2 word3 word1 word2 word4' 
>>> remove_list = ['word1', 'word2'] 
>>> word_list = sentence.split() 
>>> ' '.join([i for i in word_list if i not in remove_list]) 
'word3 word4' 
+0

Groovy。それを考えなかった。ありがとう:) – Ogre

+0

これは句読点では難しく、タブ/連続した空白(後者が重要かどうかわからない)は保持しません。 – NPE

+3

'remove_list'が大きければ、' remove_set = {'word1'、 'word2'、...} 'のほうがはるかに高速です。 –