模糊正则表达式:替换的模糊计数始终为1



我使用Python正则表达式模块进行近似字符串匹配。我有一个DNA序列,我想搜索一个特定的模式,同时最多允许1个取代:{s<=1}。在DNA序列中,多种模式是可以接受的。例如,前三个字符可以是"GAG"或"GAT",同样的原理适用于DNA序列的其余部分。

我在下面做了一个例子,我想在一个9个字符长的字符串上使用regex搜索。据我所知,图案应该与字符串匹配,没有任何修饰。

然而,regex为我提供了一个模糊计数为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, 0)>

当我去掉三个字符的多个选项时,这个问题就不会再发生了。

dna_patt = regex.compile("(GATGAAGGG){s<=1}")
print(dna_patt.search(sequence))

<regex.Match object; span=(0, 9), match='GATGAAGGG'>

我的问题是:我在模式创建中做错了什么?还是我误解了模糊计数的工作原理?欢迎任何提示或改进。

来自regex模块文档:

默认情况下,模糊匹配搜索满足给定约束。

在您的情况下,使用GAG并执行一次替换来获得第一个匹配(因为GAGGAT之前尝试(。您可以使用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'>

您还可以使用字符类将GTGA[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, 9), match='GATGAAGGG'>

Python演示

最新更新