4

我希望有这样的功能:

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

WhereaString类似于传递的字符串,但存在于options. 我正在使用这个函数来规范来自我正在开发的玩具应用程序的用户输入。我读过关于使用 levenshtein 距离的信息,但我决定在这里问,因为我希望 Python 标准库中有一个简单的解决方案。

4

5 回答 5

9

使用.difflib.get_close_matches

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

返回最佳“足够好”匹配的列表。word 是需要紧密匹配的序列(通常是字符串),可能性是要匹配 word 的序列列表(通常是字符串列表)。

于 2013-04-18T19:44:41.920 回答
4

计算 Levenshtein 距离:

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

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

于 2013-04-18T18:03:28.150 回答
4

我想你可能想看看这篇文章。你只需要一个模糊字符串比较器。

https://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy-string-comparison

于 2013-04-18T18:03:53.967 回答
1

我建议使用fuzzywuzzy Seat Geek。他们有一个很棒的功能,称为 process 可以完全满足您从他们的网站上寻找的功能,但适合您的问题:

    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)]
于 2017-03-26T14:14:14.567 回答
0

从您的问题的描述中,您不需要任何类型的字符串相似性,您只需要知道输入字符串是否在列表中。为此,只需使用一个集合,并测试该字符串是否在集合中,如下所示:

def isStringAcceptable(string, set):
    return string in set

如果你想容忍用户输入错误的字符串,你需要决定你要容忍什么样的错误。使用 Levinshtein distance 之类的东西可能对你想要的东西来说太过分了,它可能会给你带来有趣的结果。如果您只想检查大小写,请调用string.lower()并确保您的集合中的所有字符串都是小写的。您可能不需要像字符串相似度度量那样花哨的东西。

于 2013-04-18T19:37:21.973 回答