如何解决模糊正则表达式:替换的模糊计数始终为 1
我使用 Python regex 模块进行近似字符串匹配。我有一个 DNA 序列,我想搜索特定模式,同时允许最多 1 个替换:{s
我在下面做了一个例子,我想在一个 9 个字符的长字符串上使用正则表达式搜索。据我了解,该模式应与字符串匹配而无需任何替换。
但是,正则表达式为我提供了一个模糊计数为 1 的替换匹配(见下文)。我不明白这一点,因为序列与模式匹配。
import regex
dna_patt = regex.compile("((GAG|GAT)(TCT|GAA)(GCC|GGG|GGT)){s<=1}")
sequence = "GATGAAGGG"
print(dna_patt.search(sequence))
<regex.Match object; span=(0,9),match='GATGAAGGG',fuzzy_counts=(1,0)>
当我去掉三个字符的多个选项后,这个问题就不会再出现了。
dna_patt = regex.compile("(GATGAAGGG){s<=1}")
print(dna_patt.search(sequence))
<regex.Match object; span=(0,match='GATGAAGGG'>
我的问题是:我在创建模式时做错了什么?还是我误解了模糊计数的工作原理?欢迎任何提示或改进。
解决方法
来自正则表达式模块文档:
默认情况下,模糊匹配搜索满足 给定的约束。
在您的情况下,第一个匹配项是使用 GAG
并执行一次替换获得的(因为在 GAG
之前尝试了 GAT
)。您可以使用 BESTMATCH
标志来查找最佳匹配:
import regex
dna_patt = regex.compile("((GAG|GAT)(TCT|GAA)(GCC|GGG|GGT)){s<=1}",regex.BESTMATCH)
sequence = "GATGAAGGG"
print(dna_patt.search(sequence))
它给出:
<regex.Match object; span=(0,9),match='GATGAAGGG'>
,
您还可以使用字符类将 G
或 T
与 GA[GT]
匹配以第一次找到 GAT。
如果您之后不需要捕获组,您可以使用 (?:
import regex
dna_patt = regex.compile("(?:GA[GT](?:TCT|GAA)(?:GCC|GG[GT])){s<=1}")
sequence = "GATGAAGGG"
print(dna_patt.search(sequence))
结果
<regex.Match object; span=(0,match='GATGAAGGG'>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。