使difflib的SequenceMatcher忽略“垃圾”字符

时间:2012-04-02 20:53:36

标签: python difflib sequencematcher

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

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

我想要这样的话给出100%的匹配,即ratio of 1.0。我知道上面函数中指定的垃圾字符不用于比较,而是查找最长的连续匹配子序列。 我是否可以通过某种方式让SequenceMatcher忽略某些“垃圾”字符以进行比较

2 个答案:

答案 0 :(得分:4)

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

E.g:

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

如图所示here,这比正则表达式显着(3倍)更快(我感觉更好)。

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

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.

答案 1 :(得分:1)

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

string=re.sub('-|_|\*','',string)
正则表达式'-|_|\*'

只是放了一个|在所有垃圾字符之间,如果它是一个特殊的重新字符,则在其前加\(如*+