Как удалить список слов из списка строк

Извините, если вопрос немного запутан. Это похоже на этот вопрос

Я думаю, что этот вопрос близок к тому, что я хочу, но в Clojure.

здесь другое вопрос

Мне нужно что-то вроде этого, но вместо "[br] " в этом вопросе есть список строк, которые нужно искать и удалять.

4 ответов


вот мой удар по нему. Это использует регулярные выражения.

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: вышеуказанное изменение позволяет избежать отсечения трейлинга"на" из "Испании". Для проверки запустите обе версии регулярных выражений против фразы "Испания имеет дождь".


без regexp вы можете сделать следующее:

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

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

так как вы хотели бы знать, что вы делаете неправильно, эта строка:

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

имеет место, а затем начинает цикл над словами. Сначала он проверяет "на". Ваше место (например, "Нью-Йорка") проверяется, начинается ли оно с "of". Он преобразуется (вызов для замены и полосы) и добавляется в список результатов. Самое главное здесь то, что результат никогда не рассматривается снова. Для каждого слова, которое вы повторяете в понимании, в список результатов добавляется новый результат. Так следующее слово- "the", и ваше место ("Нью-Йорк") не начинается с" the", поэтому новый результат не добавляется.

Я предполагаю, что результат, который вы получили в конечном итоге, - это конкатенация ваших переменных места. Более простой для чтения и понимания процедурный вариант будет (непроверенный):

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

имейте в виду, что replace() удалит слово в любом месте строки, даже если оно происходит как простая подстрока. Вы можете избежать этого, используя regexes с шаблоном что-то вроде ^the\b.