10

質問が少し紛らわしい場合は申し訳ありません。これはこの質問に似ています

上記の質問は私が望むものに近いと思いますが、Clojureでは。

別の質問があります

このようなものが必要ですが、その質問の「[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

4 に答える 4

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
于 2010-08-18T11:25:18.377 に答える
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 」の末尾が切り取られるのを回避できます。検証するには、「スペインには雨が降っています」というフレーズに対して、両方のバージョンの正規表現を実行します。

于 2010-08-18T09:58:58.513 に答える
4
>>> 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']
于 2010-08-18T10:04:41.123 に答える
1

あなたが間違っていることを知りたいので、この行:

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

発生し、単語のループを開始します。まず、"of" をチェックします。あなたの場所 (例: "of the New York") が "of" で始まるかどうかがチェックされます。これは変換され (replace と strip の呼び出し)、結果リストに追加されます。ここで重要なことは、結果が二度と検査されないことです。内包表記で繰り返し処理するすべての単語に対して、新しい結果が結果リストに追加されます。したがって、次の単語は「the」であり、あなたの場所 (「of the New York」) は「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

于 2010-08-18T10:13:00.247 に答える