我希望在Perl中使用DNA字符串的反向补码。所以这很简单,我有以下表达式。
$revcomp =~ tr/ACGTacgt[]N/TGCAtgca][./;
然后反转字符串。 []
照顾模棱两可的角色。但是,如果我想扩展它以允许更复杂的表达式,这个简单的方案就会失败。例如,C[AG]{7,10}[ACGT]{5,8}ATGC
将导致正则表达式GCAT{8,5}[ACGT]{01,7}[CT]G
,这不是我们想要的(在花括号也被考虑之后)。预期的反向补充为GCAT[ACGT]{5,8}[CT]{7,10}G
。我怎么能这样做?
答案 0 :(得分:2)
要使量词的正则表达式正常工作,您需要以元素方式而不是字符方式反转表达式。通过“逐元素”,我的意思是单个字符或字符类以及下面的量词(如果有的话)必须被视为一个单元。例如,在C[AG]{7,10}[ACGT]{5,8}ATGC
的示例中,有7个元素:C- [AG] {7,10} - [ACGT] {5,8} -A-T-G-C。您需要将其分解为元素列表并反转列表的顺序,而不是将其作为单个字符串反转。
ETA:代码
#!/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