Python 根据已知字母和字母位置查找可能的单词

Python 根据已知字母和字母位置查找可能的单词,python,crossword,Python,Crossword,我试图通过已知的字母和字母位置(类似于纵横字谜)找到一个单词,类似于crosswordsolver.org所做的 例如: input: B E _ K possible words: BEAK BECK BELK BERK 我在列表中列出了所有可能的单词(长度相同)。 问题是,我找不到合适的解决方案来比较用户输入和我的列表 将字典上每个单词的索引与用户输入的单词字母进行比较似乎是一个解决方案,但根本没有效率 有没有其他办法解决这个问题 先谢谢你 编辑:我应该补充一点,正则表达式不能用作解

我试图通过已知的字母和字母位置(类似于纵横字谜)找到一个单词,类似于crosswordsolver.org所做的

例如:

input: 
B E _ K

possible words: 
BEAK
BECK
BELK
BERK
我在列表中列出了所有可能的单词(长度相同)。 问题是,我找不到合适的解决方案来比较用户输入和我的列表

将字典上每个单词的索引与用户输入的单词字母进行比较似乎是一个解决方案,但根本没有效率

有没有其他办法解决这个问题

先谢谢你

编辑:我应该补充一点,正则表达式不能用作解决方案,因为我使用的是波斯语(波斯语)单词,它使用波斯语字母(类似于阿拉伯语)

用户输入被逐字记录并存储为列表。 可能有多个缺少的字母,单词长度可以是1-10之间的任意值。请查看

例如:

import re
pattern = re.compile('BE.K')
possible_words = [word for word in all_words if re.match(pattern, word)]

行。

我建议你用你的单词列表建立一棵树

*-+-A
  |
  +-B-+-A
  |   |
      +-B
      |
      +-C
      |
      +-C
      |
      +-E-+-A-+
      |   |   |
              .
              .
              |
              +-K-x ("BEAK")
搜索速度快,内存消耗低

如果不想从头开始,可以使用anytree模块。

快速破解

# Save pattern as (char, position) where position starts at 0
pattern = [("B", 0), ("E", 1), ("K", 3)] 

dictionary = ["BEAK", "BECK", "BELK", "BERK"]

def match(word, pattern):
    if len(pattern) > len(word):
        return false

    return all(word[pos] == c for (c, pos) in pattern):

def list_matches(pattern, dictionary):
    for word in dictionary:
        if match(word, pattern):
            print(word)

list_matches(pattern, dictionary)

你可以使用一个数据结构,这样会更有效率。

使用
r'be.K'
作为正则表达式模式,它的
逐字逐句
而不是
word for work
在你的compBE列表中。K就是一个例子,正则表达式可以作为一个很好的解决方案来实现。但是,我的字典包含波斯语单词(类似于阿拉伯语字母)所以我不能用regex@A.Aminidad关键是使用原始字符串将您从正则表达式中的反斜杠地狱中解救出来。例如,要匹配反斜杠,您需要两个write“\\\\”或仅仅是r“\\”,因为您需要转义正则表达式和非原始python字符串的斜杠。所以这更容易阅读。输入中是否总是只有一个未知字母?您的可能单词列表中有多少个单词?您能否添加用户输入的存储方式?用户如何输入未定义的字符
\uu
?正则表达式可与Unicode一起使用。您使用的是哪个版本的Python?