Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有效地检查单词是否与集合中的模式匹配(Python)_Python_Glob - Fatal编程技术网

有效地检查单词是否与集合中的模式匹配(Python)

有效地检查单词是否与集合中的模式匹配(Python),python,glob,Python,Glob,我有许多简单的全球化模式和完整的单词,如下所示: s = set(['ALE', 'BREAD*', 'BREAKFAST*', 'BROTH' ...]) 我还列出了一大堆单词。我想检查这个列表中的每个单词是否匹配a)集合中的一个全局模式或b)集合中的一个单词 如果没有全球化模式,我只会做如下操作: for word in words: if word in s: # do something 但由于集合也包含全局模式,如果我想将“BREADY”与“BREAD*”匹

我有许多简单的全球化模式和完整的单词,如下所示:

s = set(['ALE', 'BREAD*', 'BREAKFAST*', 'BROTH' ...])
我还列出了一大堆单词。我想检查这个列表中的每个单词是否匹配a)集合中的一个全局模式或b)集合中的一个单词

如果没有全球化模式,我只会做如下操作:

for word in words:
    if word in s:
        # do something
但由于集合也包含全局模式,如果我想将“BREADY”与“BREAD*”匹配,它将找不到匹配项


我能想到的唯一方法是使用嵌套的for循环将每个单词与集合中的每个模式进行比较。有没有一种方法可以在不与集合中的每个元素进行比较的情况下检查集合中的每个单词是否匹配?

假设我们有一个单词列表
单词
,以及一个搜索列表
搜索
。对于您给出的简单示例,以下内容就足够了

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

您应该将要匹配的完整字符串与要匹配的前缀分开存储。对于前缀,进一步将它们划分为等长前缀集(即一组长度为1的前缀、一组长度为2的前缀等)

i、 e

完整字符串匹配很简单-只需检查完整字符串中的单词是否为

对于前缀,您将分别检查每个长度,从长度1到要匹配的最大前缀长度。对于每个长度
n
,检查前缀中的
单词[:n]是否按长度[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"

就算特工不想绕圈子

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

是否确实要匹配
BREA
breadddd
?这些是全局模式,而不是正则表达式。是否只处理完整单词匹配和前缀匹配?或者你的一些全球模式更复杂,例如“EAAST”@WaleedKhan-在这种情况下,是的。这组模式来自于,单词列表是连环漫画的抄本。我想根据RID将成绩单中的单词进行分类,所以如果角色说“我想要一些面包”,我仍然希望它能找到匹配项。MartijnPieters谢谢,将更新帖子以反映这一点。tom,只有完整的单词匹配和前缀匹配对不起,我忘了提到每次我检查一个单词时,我都试图避免在所有前缀上循环。更新后的帖子反映了这一点。
HIT ALE
HIT BREADDY
HIT BREAKFASTY
HIT BROTH