Regex 反转正则表达式

Regex 反转正则表达式,regex,perl,expression,Regex,Perl,Expression,我想在Perl中得到DNA字符串的反向补码。这很简单,我有下面的表达式 $revcomp =~ tr/ACGTacgt[]N/TGCAtgca][./; 然后反转字符串。[]处理不明确的字符。然而,如果我想扩展它以允许更复杂的表达式,这个简单的方案就失败了。e、 例如,C[AG]{7,10}[ACGT]{5,8}ATGC将产生一个正则表达式GCAT{8,5}[ACGT]{01,7}[CT]g,这不是我们想要的(在花括号也被考虑之后)。预期的反向补码是GCAT[ACGT]{5,8}[CT]{7,

我想在Perl中得到DNA字符串的反向补码。这很简单,我有下面的表达式

$revcomp =~ tr/ACGTacgt[]N/TGCAtgca][./;

然后反转字符串。
[]
处理不明确的字符。然而,如果我想扩展它以允许更复杂的表达式,这个简单的方案就失败了。e、 例如,
C[AG]{7,10}[ACGT]{5,8}ATGC
将产生一个正则表达式
GCAT{8,5}[ACGT]{01,7}[CT]g
,这不是我们想要的(在花括号也被考虑之后)。预期的反向补码是GCAT[ACGT]{5,8}[CT]{7,10}G。我怎样才能做到这一点呢?

要使带有量词的正则表达式正常工作,需要按元素而不是按字符反转表达式。“元素方面”,我的意思是单个字符或字符类以及以下量词(如果有)必须被视为单个单元。e、 例如,在您的
C[AG]{7,10}[ACGT]{5,8}ATGC
示例中,有7个元素:C-[AG]{7,10}-[ACGT]{5,8}-A-T-g-C。您需要将其分解为该元素列表并反转列表的顺序,而不是将其作为单个字符串反转

预计到达时间:代码

#!/usr/bin/env perl    

use strict;
use warnings;
use 5.010;

my $re = 'C[AG]{7,10}[ACGT]{5,8}ATGC';

$re =~ tr/ACGTacgt/TGCAtgca/;

my @elem = $re =~ /((?:\[.*?\]|.)(?:\{.*?})?)/g;

my $rev = join '', reverse @elem;

say $rev;
输出:


GCAT[TGCA]{5,8}[TC]{7,10}G

首先解释如何从
C[AG]{7,10}[ACGT]{5,8}[CT]{7,10}[ACGT]{5,8}ATGC中获得
GCAT[ACGT]{5,8}[CT]{/code>DNA字符串的反向补码是通过将a替换为T、C替换为G、G替换为C、T来获得的,同一个量词应该与Dave下面的回答中的反补字符相关联。“某物应该与某物相关联”不是对如何做某事的描述。如果你不能告诉一个人怎么做,你希望如何告诉计算机?(由于所需的输出中没有
01
,因此想要反转字符串也是错误的。您对算法的描述完全错误。)