如何从字符串列表中删除单词列表

时间:2010-08-18 09:52:48

标签: python regex list-comprehension stop-words

很抱歉,如果这个问题有点令人困惑。这类似于this question

我认为上述问题与我想要的很接近,但在Clojure中。

another个问题

我需要这样的东西,但在该问题中没有'[br]',而是有一个需要搜索和删除的字符串列表。

希望我明白自己。

我认为这是因为python中的字符串是不可变的。

我有一个需要从字符串列表中删除的干扰词列表。

如果我使用列表推导,我最终会一次又一次地搜索相同的字符串。因此,只有“of”被删除而不是“the”。所以我的修改后的列表看起来像这样

places = ['New York', 'the New York City', 'at Moscow' and many more]

noise_words_list = ['of', 'the', 'in', 'for', 'at']

for place in places:
    stuff = [place.replace(w, "").strip() for w in noise_words_list if place.startswith(w)]

我想知道我在做什么错误。

4 个答案:

答案 0 :(得分:15)

如果没有正则表达式,你可以这样做:

places = ['of New York', 'of the New York']

noise_words_set = {'of', 'the', 'at', 'for', 'in'}
stuff = [' '.join(w for w in place.split() if w.lower() not in noise_words_set)
         for place in places
         ]
print stuff

答案 1 :(得分:10)

这是我的捅。这使用正则表达式。

import re
pattern = re.compile("(of|the|in|for|at)\W", re.I)
phrases = ['of New York', 'of the New York']
map(lambda phrase: pattern.sub("", phrase),  phrases) # ['New York', 'New York']

Sans lambda

[pattern.sub("", phrase) for phrase in phrases]

更新

修复gnibbler指出的错误(谢谢!):

pattern = re.compile("\\b(of|the|in|for|at)\\W", re.I)
phrases = ['of New York', 'of the New York', 'Spain has rain']
[pattern.sub("", phrase) for phrase in phrases] # ['New York', 'New York', 'Spain has rain']

@prabhu:上述更改避免从“西班牙”中删除尾随“ in ”。要验证针对短语“西班牙有雨”运行两个版本的正则表达式。

答案 2 :(得分:3)

>>> import re
>>> noise_words_list = ['of', 'the', 'in', 'for', 'at']
>>> phrases = ['of New York', 'of the New York']
>>> noise_re = re.compile('\\b(%s)\\W'%('|'.join(map(re.escape,noise_words_list))),re.I)
>>> [noise_re.sub('',p) for p in phrases]
['New York', 'New York']

答案 3 :(得分:1)

既然你想知道自己做错了什么,这一行:

stuff = [place.replace(w, "").strip() for w in noise_words_list if place.startswith(w)]

发生,然后开始循环单词。首先,它检查“of”。检查您的位置(例如“纽约的”)以查看它是否以“of”开头。它被转换(调用replace和strip)并添加到结果列表中。这里至关重要的是,结果永远不会再被检查。对于您在理解中迭代的每个单词,都会在结果列表中添加新结果。所以接下来的单词是“the”,你的地方(“纽约”)并不以“the”开头,所以没有新的结果。

我假设你最终得到的结果是地方变量的连接。更简单的阅读和理解程序版本将是(未经测试):

results = []
for place in places:
    for word in words:
        if place.startswith(word):
            place = place.replace(word, "").strip()
    results.append(place)

请记住,replace()将删除字符串中的任何位置,即使它出现在一个简单的子字符串中。您可以通过使用类似^the\b的模式的正则表达式来避免这种情况。