gpt4 book ai didi

python - 模糊正则表达式(例如 {e<=2})在 Python 中的正确用法

转载 作者:太空狗 更新时间:2023-10-30 02:54:16 25 4
gpt4 key购买 nike

我试图找到与原始模式字符串“相差”最多两个错误的字符串(即它们最多相差两个字母)。

但是,下面的代码并没有像我预期的那样工作,至少从我对模糊正则表达式的理解来看是这样的:

import regex
res = regex.findall("(ATAGGAGAAGATGATGTATA){e<=2}", "ATAGAGCAAGATGATGTATA", overlapped=True)
print res
>> ['ATAGAGCAAGATGATGTATA'] # the second string

如您所见,两个字符串在三个字母上不同,而不是最多两个:

第一个有:ATAGGAGAAGATGATGTATA

第二个有:ATAGAGCAAGATGATGTATA

但结果显示第二个字符串,就好像它在 e<=2 内一样(这也发生在 overlapped=False 的情况下,所以不可能是这样)。

我在这里错过了什么?有没有办法让它只在给定模式的汉明 2 球内找到字符串?

是否有可能将字母交换视为仅一次更改?如果是这样 - 我怎样才能避免这种情况?

最佳答案

让我们检查一下这段代码的模糊计数:

>>> pattern_string = 'ATAGGAGAAGATGATGTATA'
>>> query_string = 'ATAGAGCAAGATGATGTATA'
>>> r = regex.compile('(%s){e<=2}' % pattern_string)
>>> r.match(query_string)
<regex.Match object; span=(0, 20), match='ATAGAGCAAGATGATGTATA', fuzzy_counts=(0, 1, 1)>

fuzzy_counts=(0, 1, 1) 表示在这种情况下,我们没有得到替换、1 次插入和 1 次删除。所以您的过滤器有效,因为错误总数为 2。

但似乎您只需要按替换计数进行过滤,因此您可以修改正则表达式:

import regex
res = regex.findall("(ATAGGAGAAGATGATGTATA){s<=2}", "ATAGAGCAAGATGATGTATA", overlapped=True)
print res

docs 查看这个很好的例子:

  • {i<=3} 最多允许插入 3 次,但不允许其他类型
  • {d<=3} 允许最多删除 3 个,但没有其他类型
  • {s<=3} 最多允许 3 个替换,但没有其他类型
  • {i<=1,s<=2} 最多允许 1插入和最多 2 个替换,但没有删除
  • {e<=3} 允许最多 3 个错误
  • {1<=e<=3} 允许至少 1 个和最多 3 个错误

  • {i<=2,d<=2,e<=3} 允许最多 2 次插入,最多 2 次删除,在总共最多 3 个错误,但没有替换

关于python - 模糊正则表达式(例如 {e<=2})在 Python 中的正确用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46540062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com