模糊正则表达式:替换的模糊计数始终为 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
并执行一次替换获得的(因为 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'>
您也可以使用字符 class 将 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 正则表达式模块进行近似字符串匹配。我有一个 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
并执行一次替换获得的(因为 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'>
您也可以使用字符 class 将 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'>