Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 制作difflib';s SequenceMatcher ignore“忽略”;“垃圾”;人物_Python_Difflib_Sequencematcher - Fatal编程技术网

Python 制作difflib';s SequenceMatcher ignore“忽略”;“垃圾”;人物

Python 制作difflib';s SequenceMatcher ignore“忽略”;“垃圾”;人物,python,difflib,sequencematcher,Python,Difflib,Sequencematcher,我有很多字符串,我想匹配相似性(每个字符串平均30个字符)。我发现difflib的SequenceMatcher非常适合这个任务,因为它很简单,结果也很好。但是如果我像这样比较hellboy和hellboy >>> sm=SequenceMatcher(lambda x:x=='-','hellboy','hell-boy') >>> sm.ratio() 0: 0.93333333333333335 我希望这些词能100%匹配,即比率为1.0。我知道上面函

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

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

我希望这些词能100%匹配,即
比率为1.0
。我知道上面函数中指定的垃圾字符不用于比较,而是用于查找最长的连续匹配子序列我是否有办法让SequenceMatcher忽略一些“垃圾”字符以进行比较

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

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

对于正则表达式
'-|u124;\*'
只需在所有垃圾字符之间加一个|,如果它是一个特殊的重新字符,则在它前面加一个
\
(如
*
+

如果你想按照我在评论中建议的那样做,(删除垃圾字符),最快的方法就是使用

例如:

如图所示,这比正则表达式快3倍(我觉得读起来更舒服)

请注意,在Python3.x下,或者如果在Python2.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.

这有点骇人,但有什么原因不能在进行比较之前删除垃圾字符吗?这与忽略它们基本上是一样的。是的,这很好,但我想知道我是否可以做一些
difflib
魔术,然后不做它,否则我将不得不通过另一个函数传递字符串以首先删除所有垃圾字符。
-\u124;\*
比使用
[-\u*]好吗
或者它们在效率方面是否相同?
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.