在Python中是否有一种标准方法可以将具有任意可接受值列表的字符串模糊匹配?

时间:2013-04-18 18:00:33

标签: python string python-2.7

我希望有这样的功能:

def findSimilar(string, options):
    ....
    return aString

aString与传递的字符串相似但options中存在。我正在使用此功能来规范我正在处理的玩具应用程序的用户输入。我读到了使用levenshtein距离,但我决定在这里问,因为我希望Python标准库中有一个简单的解决方案。

5 个答案:

答案 0 :(得分:6)

使用difflib .get_close_matches

  

get_close_matches(单词,可能性[,n] [,cutoff])

     

返回最佳“足够好”的比赛清单。 word是一个需要密切匹配的序列(通常是一个字符串),和   可能性是与词匹配的序列列表   (通常是字符串列表)。

答案 1 :(得分:4)

计算Levenshtein距离:

http://en.wikipedia.org/wiki/Levenshtein_distance

已经有python实现,虽然我不知道它们的质量......

答案 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()并确保您集合中的所有字符串均为小写。您可能不需要像字符串相似性度量那样花哨的东西。