我发现库中的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”。但是我用isjunksimilar_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))

07-24 14:20