我有很多字符串要匹配相似性(每个字符串平均为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
忽略某些“垃圾”字符以进行比较?
答案 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)
正则表达式'-|_|\*'
的只是放了一个|在所有垃圾字符之间,如果它是一个特殊的重新字符,则在其前加\
(如*
和+
)