【问题标题】:Python regex module fuzzy match: substitution count not as expectedPython 正则表达式模块模糊匹配:替换计数不如预期
【发布时间】:2015-09-20 12:35:28
【问题描述】:

背景

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)

【问题讨论】:

    标签: python regex mismatch dna-sequence fuzzy-comparison


    【解决方案1】:

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

    将 s 减小到 s

    >>> 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)
    

    为什么它会以这种方式运行对我来说仍然是个谜。

    【讨论】:

    • 此行为似乎已修复(正则表达式版本 2.4.106)所有上述示例现在都返回正确的插入/替换分数 (0,0,1)
    【解决方案2】:

    这是由 regex 模块的成本计算中的一个错误引起的。在 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,并附有说明

    汞问题 161:意外的模糊匹配结果

    修复了错误并进行了一些相关的整理。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多