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

2024-10-01 17:40:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有很多字符串,我想匹配相似性(每个字符串平均为30个字符)。我发现difflib'sSequenceMatcher非常适合这个任务,因为它很简单,而且结果很好。但是如果我像这样比较hellboy和{}

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

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


Tags: oflambda字符串字符相似性垃圾smboy
2条回答

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

例如:

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

here所示,这明显比正则表达式快(3倍)(我觉得读起来更好)。在

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

^{pr2}$

你也可以用一个小函数来保存一些输入,如果你想删除很多字符,只需设置一个集合并通过:

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.

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

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

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

相关问题 更多 >

    热门问题