Skip to main content
 首页 » 编程设计

Python正则表达式模块模糊匹配: substitution count not as expected

2024年10月24日35fff_TT

背景

Python 模块 regex允许模糊匹配。

您可以指定允许的替换数 (s)、插入数 (i)、删除数 (d) 和总错误数 (e)。

匹配结果的 fuzzy_counts 属性返回一个元组 (0,0,0),其中:

match.fuzzy_counts[0] = count for 's'  
match.fuzzy_counts[1] = count for 'i'  
match.fuzzy_counts[2] = count for 'd' 

问题

删除和插入按预期计算,但不计算替换。

在下面的示例中,唯一的变化是查询中删除了一个字符,但替换计数为 6(如果删除 BESTMATCH 选项则为 7)。

如何计算替换数?

如果有人能向我解释这是如何工作的,我将不胜感激。

>>> import regex 
>>> reference = "(TATGGGA[CT][GC]AAAG[CT]CT[AC]AA[GA]CCATGTG){s<7,i<3,d<3,e<8}" 
>>> query = "TATGGACCAAAGTCTCAAGCCATGTG"  
>>> match = regex.search(reference, query, regex.BESTMATCH) 
>>> print(match.fuzzy_counts) 
(6,0,1) 

请您参考如下方法:

这个问题似乎与允许的错误设置中的值有关。

将 s 减少到 s < 3 会向下更改模糊匹配元组得分:

>>> reference = "(TATGGGA[CT][GC]AAAG[CT]CT[AC]AA[GA]CCATGTG){s<3,i<3,d<3,e<4}"  
>>> query = "TATGGACCAAAGTCTCAAGCCATGTG"   
>>> match = regex.search(reference, query, regex.BESTMATCH) 
>>> print(match.fuzzy_counts)  
(1,0,1) 

进一步减少 's' 的允许错误会返回此匹配项的预期 's' 分数:

>>> reference = "(TATGGGA[CT][GC]AAAG[CT]CT[AC]AA[GA]CCATGTG){s<2,i<3,d<3,e<4}" 
>>> query = "TATGGACCAAAGTCTCAAGCCATGTG"  
>>> match = regex.search(reference, query, regex.BESTMATCH) 
>>> print(match.fuzzy_counts) 
(0,0,1) 

为什么它会这样,对我来说仍然是个谜。