我希望有这样的功能:
def findSimilar(string, options):
....
return aString
aString
与传递的字符串相似但options
中存在。我正在使用此功能来规范我正在处理的玩具应用程序的用户输入。我读到了使用levenshtein距离,但我决定在这里问,因为我希望Python标准库中有一个简单的解决方案。
答案 0 :(得分:6)
使用difflib
.get_close_matches
。
get_close_matches(单词,可能性[,n] [,cutoff])
返回最佳“足够好”的比赛清单。 word是一个需要密切匹配的序列(通常是一个字符串),和 可能性是与词匹配的序列列表 (通常是字符串列表)。
答案 1 :(得分:4)
答案 2 :(得分:4)
我想你可能想看一下这篇文章。你只需要一个模糊的字符串比较器。
https://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy-string-comparison
答案 3 :(得分:1)
我建议使用fuzzywuzzy Seat Geek。他们有一个很棒的功能,称为流程,可以完全按照您的网站查找,但适合您的问题:
string = "new york jets"
options = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]
process.extract(string, options, limit=2)
[('New York Jets', 100), ('New York Giants', 78)]
答案 4 :(得分:0)
根据您的问题的描述,您不需要任何类型的字符串相似性,您只需要知道输入字符串是否在列表中。为此,只需使用一个集合,并测试该字符串是否在集合中,如下所示:
def isStringAcceptable(string, set):
return string in set
如果您想要容忍输入错误字符串的用户,您需要确定您将容忍哪种错误。使用Levinshtein距离之类的东西可能会对你想要的东西造成严重的过度杀伤,它可能会给你带来有趣的结果。如果您只想检查外壳,请调用string.lower()
并确保您集合中的所有字符串均为小写。您可能不需要像字符串相似性度量那样花哨的东西。