如何解读regex库模糊字符串匹配的fuzzy_counts及匹配结果?
Regex库模糊匹配中fuzzy_counts的操作定义解惑
我在使用Python的regex库做模糊子串匹配(比如判断数据库同一条记录的某个字段是否作为模糊子串出现在其他字段中)时,对fuzzy_counts的定义产生了疑惑。
示例场景与代码
import regex to_search = "1990 /" # 字符位置标记:1(1),2(9),3(9),4(0),5(空格),6(/) search_in = "V CAD-0000:0000[01] ISS 23/10/91" m = regex.search(f'({to_search}){{e<4}}', search_in, regex.BESTMATCH)
运行结果
>>> m <regex.Match object; span=(27, 30), match='10/', fuzzy_counts=(0, 0, 3)> >>> m.fuzzy_changes ([], [], [28, 29, 31])
根据官方文档,fuzzy_counts的顺序是**(替换次数, 插入次数, 删除次数)**,但我最初误解为“删除目标文本(search_in)中的对应字符得到匹配”,实际却是从模式串(to_search)中删除3个字符(位置2、3、5的'9'、'0'、空格)后,才能和目标子串10/完全匹配。
用orc工具辅助分析的结果也验证了这一点:
>>> import orc >>> near_match = orc.NearMatch.from_regex(m, to_search) >>> print(near_match) 10/ I 190/ I 1990/ I 1990 /
核心结论:操作对象是模式串而非目标文本
regex库模糊匹配中的fuzzy_counts顺序确实是(替换、插入、删除),但所有操作的参照对象是你定义的模式串(to_search),不是要搜索的目标文本(search_in):
- 替换:修改模式串中的字符,使其匹配目标文本的子串
- 插入:在模式串中添加字符,使其匹配目标文本的子串
- 删除:从模式串中移除字符,让剩余部分匹配目标文本的子串
对应到示例场景:
- 模式串
1990 /需要删除3个字符(第二个'9'、'0'、空格),才能和目标子串10/完全匹配,因此fuzzy_counts=(0,0,3) fuzzy_changes中的第三个列表[28,29,31]是目标文本中未被模式串匹配到的位置,对应模式串删除操作的反向映射——这些位置的字符是模式串中被删除的部分本应匹配的目标文本位置(但因为删除了模式串的字符,所以这些位置没有被计入匹配的span)
内容的提问来源于stack exchange,提问作者RolfBly
相关产品推荐
相关产品推荐

