我使用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
并执行一次替换来获得第一个匹配(因为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, 9), match='GATGAAGGG'>
Python演示