1

私は次のような多くの単純なグロブパターンと単語全体のセットを持っています:

s = set(['ALE', 'BREAD*', 'BREAKFAST*', 'BROTH' ...])

単語のリストもたくさんあります。このリストの各単語が、a)セット内のグロブパターン、またはb)セット内の単語のいずれかに一致するかどうかを確認したいと思います。

グロブパターンがない場合は、次のようにします。

for word in words:
    if word in s:
        # do something

しかし、セットにはグロブパターンも含まれているため、「BREADY」を「BREAD *」に一致させたい場合、一致するものは見つかりません。

これを行うために私が考えることができる唯一の方法は、ネストされたforループを使用して、各単語をセット内の各パターンと比較することです。セット内のすべての要素と比較せずに、各単語がセット内で一致するかどうかを確認する方法はありますか?

4

3 に答える 3

1

照合するプレフィックスとは別に、照合する完全な文字列を保存する必要があります。プレフィックスについては、さらにそれらを同じ長さのプレフィックスのセットに分割します(つまり、長さ1のプレフィックスのセット1つ、長さ2のプレフィックスのセット1つなど)。

すなわち

fullstrings = set(["BREAKFAST", "LUNCH", "DINNER", ...])
prefixes_by_length = {} # dict of length -> prefix string
...
prefixes_by_length[4] = set(["CORN", "DESK", ...])
prefixes_by_length[5] = set(["BREAD", "TABLE", ...])

完全な文字列の一致は簡単です-かどうかを確認してくださいword in fullstrings

プレフィックスの場合、長さ1から一致させるプレフィックスの最大長まで、各長さを個別にチェックします。長さごとnに、かどうかを確認しますword[:n] in prefixes_by_length[n]

これは、プレフィックスがたくさんある場合、毎回すべてのプレフィックスをループするよりもはるかに効率的です。

for word in words:
    if word in fullstrings:
        "Match! do something"
    for n in prefixes_by_length:
        if word[:n] in prefixes_by_length[n]:
            "Match! do something"
于 2013-02-10T23:14:20.617 に答える
1

OPがループしたくないことを認めた。

import re
import fnmatch
s = set(['ALE', 'BREAD*', 'BREAKFAST*', 'BROTH'])
patterns = [re.compile(fnmatch.translate(p)) for p in s]

for word in "BEING PALE I LIKE ALE WITH BREADDY ABROTH FOR BREAKFASTY TREATS AND BROTH".split():
    for pattern in patterns:
        if pattern.match(word):
            print "HIT", word

与える:

HIT ALE
HIT BREADDY
HIT BREAKFASTY
HIT BROTH
于 2013-02-10T23:37:55.513 に答える
0

ワードリストwordsと検索リストがあるとしますsearches。あなたが与えた簡単な例では、以下で十分です。

for word in words:
    for search in searches:
        if search[-1] == "*":
            search = search[:-1]
            if word.lower().startswith(search.lower()):
                yield word
        else:
            if word.lower() == search.lower():
                yield word
于 2013-02-10T23:07:24.417 に答える