首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让衍射库的SequenceMatcher忽略“垃圾”字符

让衍射库的SequenceMatcher忽略“垃圾”字符
EN

Stack Overflow用户
提问于 2012-04-02 20:53:36
回答 2查看 3.5K关注 0票数 7

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

代码语言:javascript
复制
>>> sm=SequenceMatcher(lambda x:x=='-','hellboy','hell-boy')
>>> sm.ratio()
0: 0.93333333333333335

我希望这样的话能百分之百匹配,即ratio of 1.0。据我所知,上述函数中指定的垃圾字符不是用于比较,而是查找最长的连续匹配子序列。我有什么办法可以让SequenceMatcher 忽略一些“垃圾”字符来比较吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-03 10:16:09

如果您想按照我在注释中的建议来做,(删除垃圾字符)最快的方法是使用str.translate()

例如:

代码语言:javascript
复制
to_compare = to_compare.translate(None, {"-"})

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

注意,在Python3.x下,或者如果在Python2.x下使用Unicode,这将无法工作,因为delchars参数不被接受。在这种情况下,只需进行到None的映射即可。例如:

代码语言:javascript
复制
translation_map = str.maketrans({"-": None})
to_compare = to_compare.translate(translation_map)

如果您有很多要删除的字符,您也可以使用一个小函数来保存一些输入,只需设置一个设置并通过:

代码语言:javascript
复制
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.
票数 4
EN

Stack Overflow用户

发布于 2012-04-03 00:39:12

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

代码语言:javascript
复制
string=re.sub('-|_|\*','',string)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9983664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档