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

Fuzzy regex: fuzzy count for substitution is always 1

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

我在下面做了一个例子,我想在一个 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, 0)>

当我去掉三个字符的多个选项后,这个问题就不会再出现了。

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

print(dna_patt.search(sequence))

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

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

来自正则表达式模块文档:

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'>

您也可以使用字符 class 将 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