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

2024-07-04 07:28:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我在下面举了一个例子,我想在一个9个字符长的字符串上使用正则表达式搜索。据我所知,模式应该与字符串匹配,而不进行任何替换

然而,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'>

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


Tags: 字符串模式序列字符regexdna原理计数
2条回答

从regex模块文档中:

By default, fuzzy matching searches for the first match that meets the given constraints.

在您的例子中,第一个匹配是使用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 demo

相关问题 更多 >

    热门问题