2

我想在 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. 我该怎么办?

4

1 回答 1

2

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

预计到达时间:代码

#!/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

于 2012-11-29T10:52:47.397 回答