8

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

現時点の:

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

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

中:「足の速い茶色のキツネがアリを飛び越えた」

Out: 「素早く茶色のキツネが t を飛び越えた」

予想: 「素早い茶色のキツネが飛び越えた」

文字列を次のようにコンパイルするように変更しようとしましたが、役に立ちませんでした:

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

何か提案がありますか、それとも派手に明白なものが欠けていますか?

4

2 に答える 2

19

考慮したい正規表現を使用しない提案を次に示します。

>>> 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'
于 2013-03-15T15:19:03.777 に答える
13

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

直す、変える

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

regex = re.compile(r'\b('+remove+r')\b', flags=re.IGNORECASE)
                                 ^ THIS
于 2013-03-15T15:11:33.900 に答える