我正在尝试创建一个需要2个参数的函数。一个带有通配符的单词,如" * arn * val"以及包含字典的文件名。它会返回与["嘉年华"]等单词匹配的所有单词的列表。
我的代码适用于只有一个" *"然而,在其中,我不知道如何去做。
只是在文件中搜索通配符字符串没有返回任何内容。
这是我的代码:
dictionary_file = open(dictionary_filename, 'r')
dictionary = dictionary_file.read()
dictionary_file.close()
dictionary = dictionary.split()
alphabet = ["a","b","c","d","e","f","g","h","i",
"j","k","l","m","n","o","p","q","r",
"s","t","u","v","w","x","y","z"]
new_list = []
for letter in alphabet:
if wildcard.replace("*", letter) in dictionary:
new_list += [wildcard.replace("*", letter)]
return new_list
参数参数:第一个是通配符字符串(通配符),第二个是字典文件名(dictionary_filename)。
本网站上的大多数答案都是关于Regex,我不知道。
答案 0 :(得分:1)
您的特定错误是.replace
替换了所有出现的内容,例如"*arn*val"
- > "CarnCval"
或"IarnIval"
。你想要不同的字母。您可以在字母表上使用第二个嵌套循环(或使用itertools.product()
生成所有可能的字母对)来修复它,但更简单的方法是使用正则表达式:
import re
# each `*` corresponds to an ascii lowercase letter
pattern = re.escape(wildcard).replace("\\*", "[a-z]")
matches = list(filter(re.compile(pattern+"$").match, known_words))
注意:它不支持在*
中转义wildcard
。
如果输入通配符是文件模式,那么您可以使用fnmatch
module来过滤单词:
import fnmatch
matches = fnmatch.filter(known_words, wildcard)