我发现库中的SequenceMatcher
可以返回两个字符串之间的相似性分数。但是其中一个参数difflib
处理起来有点棘手,特别是正则表达式。
以两个字符串为例:
a = 'Carrot 500g'
b = 'Cabbage 500g'
from difflib import SequenceMatcher
import re
def similar_0(a, b):
return SequenceMatcher(None, a, b).ratio()
similar_0(a, b)
def similar_1(a, b):
return SequenceMatcher(lambda x: bool(re.search(r'\b(\d)+([a-zA-Z])+\b', x)), a, b).ratio()
similar_1(a, b)
在比较这两个字符串时,我想忽略上面的所有单位信息,如“500g”。但是我用
isjunk
和similar_0
得到了同样的结果。我真的很困惑similar_1
如何在isjunk
中作为一个参数工作。达到目的的正确方法是什么,或者其他的选择? 最佳答案
regex不起作用,因为SequenceMatcher
将单个字符传递给isjunk
函数,而不是单词:
>>> SequenceMatcher(print, 'Carrot 500g', 'Cabbage 500g')
b
0
5
a
e
g
C
在将这两个字符串传递给
SequenceMatcher
之前,您应该先删除它们中的垃圾:a = re.sub(r'\b(\d)+([a-zA-Z])+\b', '', a)
b = re.sub(r'\b(\d)+([a-zA-Z])+\b', '', b)
print(similar_0(a, b))