Python正则表达式用于字符串相似度比较。

4
我发现库difflib中的SequenceMatcher可以返回两个字符串之间的相似度分数。然而,其中一个参数isjunk有点棘手,特别是对于正则表达式。
以两个字符串为例:
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”。但是使用similar_0similar_1得到了相同的结果,我真的很困惑isjunkSequenceMatcher中作为参数的工作原理。有什么正确的方法来实现这个目的,或者其他的选择吗?

可能是重复的问题,与此问题相似。 - Ketan Mukadam
看了那篇帖子后,我更加困惑了,因为我的问题与正则表达式有关。非常感谢如果您能提供一个更简单的解释。 - James Wong
@JamesWong 你需要一个正则表达式来从字符串中删除任何重量(500g,100g,2kg)吗?如果是这样,你有更多的例子吗? - Mr Mystery Guest
我怀疑这个问题与正则表达式关系不大。更多的是关于当字符串传递给SequenceMatcher时如何解析。正则表达式本身很好,可以匹配“500g”。 - Wiktor Stribiżew
@MrMysteryGuest 没错,我想要过滤掉任何单位,比如(500克,100克,2千克),以及(500毫升,1磅)等等。我认为正则表达式可以解决这个问题,但问题是它如何与SequenceMatcher一起使用。 - James Wong
显示剩余3条评论
1个回答

4
您的正则表达式不起作用是因为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))

哦,太好了。我不知道那个。我认为你的解决方案足够好。谢谢。 - James Wong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接