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。
背景
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。