Python 正则表达式模块模糊匹配:替换计数不符合预期

Python regex module fuzzy match: substitution count not as expected

背景

Python模块regex允许模糊匹配。

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

fuzzy_counts属性一个匹配结果returns一个元组(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 (7如果删除 BESTMATCH 选项)。

如何计算换人次数?

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

>>> 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' 的允许误差 returns 本场比赛的预期 '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)

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

这是由 regex 模块成本计算中的一个错误引起的。它在正则表达式版本 2015.10.05 之前仍然存在,但在下一个版本 2015.10.22 中得到修复,如下所示:

$ sudo pip3 install regex==2015.10.05
Processing /root/.cache/pip/wheels/24/cb/ae/9653e30c8f801544a645e17d26fa6803aeaf76ad0482663c27/regex-2015.10.5-cp38-cp38-linux_x86_64.whl
Installing collected packages: regex
Successfully installed regex-2015.10.5
$ python3 -c '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)'
(5, 0, 1)
$ sudo pip3 install regex==2015.10.22
Processing /root/.cache/pip/wheels/60/f6/9a/23e723633e62a79064cb301c54a3b50482b8c690f86c9983ee/regex-2015.10.22-cp38-cp38-linux_x86_64.whl
Installing collected packages: regex
  Found existing installation: regex 2015.10.5
    Uninstalling regex-2015.10.5:
      Successfully uninstalled regex-2015.10.5
Successfully installed regex-2015.10.22
$ python3 -c '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)'
(0, 0, 1)

鉴于这些日期,我推断修复错误的提交是 https://bitbucket.org/mrabarnett/mrab-regex/commits/296c1daf86619039c6fe55868e7d861097d01aae,并附有描述

Hg issue 161: Unexpected fuzzy match results

Fixed the bug and did some related tidying up.

引用的错误是 https://bitbucket.org/mrabarnett/mrab-regex/issues/161