6

我有很多字符串要匹配相似度(每个字符串平均为 30 个字符)。我发现difflib's SequenceMatcher这项任务非常适合,因为它很简单并且结果很好。hellboy但如果我比较hell-boy喜欢这个

>>> sm=SequenceMatcher(lambda x:x=='-','hellboy','hell-boy')
>>> sm.ratio()
0: 0.93333333333333335

我希望这样的话能得到 100% 的匹配,即ratio of 1.0. 我知道上面函数中指定的垃圾字符不用于比较,而是用于查找最长的连续匹配子序列。有什么方法可以SequenceMatcher忽略一些“垃圾”字符以进行比较

4

2 回答 2

4

如果您希望按照我在评论中的建议进行操作,(删除垃圾字符)最快的方法是使用str.translate().

例如:

to_compare = to_compare.translate(None, {"-"})

如此处所示,比正则表达式快得多(3 倍)(而且我觉得更好读)。

请注意,在 Python 3.x 下,或者如果您在 Python 2.x 下使用 Unicode,这将不起作用,因为delchars不接受该参数。在这种情况下,您只需映射到无。例如:

translation_map = str.maketrans({"-": None})
to_compare = to_compare.translate(translation_map)

如果您有很多要删除的字符,您还可以使用一个小功能来节省一些输入,只需设置一个并通过:

def to_translation_map(iterable):
    return {key: None for key in iterable}
    #return dict((key, None) for key in iterable) #For old versions of Python without dict comps.
于 2012-04-03T10:16:09.587 回答
1

如果您要创建一个函数来预先删除所有垃圾字符,您可以使用 re:

string=re.sub('-|_|\*','',string)

对于正则表达式'-|_|\*',只需放一个 | 在所有垃圾字符之间,如果它是一个特殊的 re 字符,\在它前面放一个(比如*and +

于 2012-04-03T00:39:12.073 回答