1

我有一些基因序列(见下文),我想找到所有开放阅读框(以 ATG 开始并停止 TAG)。

我试过这个:

my $file = ('ACCCTGCCCAAAATCCCCCCGATCGATAGAGCTAAATGGCCCATGATGCATCGACTAGCTAGCTAAAATGTCGATCGATACAGCTAATAG');

while($file =~ /(ATG\w+?TAG)/g){
    print $1;           
} 

但它只给

ATGGCCCATGATGCATCGACTAGATGTCGATCGATACAGCTAATAG

我怎样才能得到每一个?

4

4 回答 4

3

找到所有出现的技巧是使用零宽度断言,这将防止“吃掉”我们的角色:(?=ATG\w+?TAG).

这样做的问题是我们会得到空匹配,所以解决方案是使用 group:
(?=(ATG\w+?TAG))。您会发现第 1 组中的所有事件。

第 1 组输出:

ATGGCCCATGATGCATCGACTAG
ATGATGCATCGACTAG
ATGCATCGACTAG
ATGTCGATCGATACAGCTAATAG

Online demo

于 2013-08-30T09:38:49.543 回答
2

结果还可以,只需在输出中将它们分开即可:

print "$1\n";
于 2013-08-30T09:37:57.300 回答
2

你得到两场比赛。要查看它们,我建议您在它们之间打印一些分隔符:

print "$1\n";

然后我们得到输出:

ATGGCCCATGATGCATCGACTAG
ATGTCGATCGATACAGCTAATAG

如果您想查找也出现在另一个帧中的帧,那么您必须确保不要消耗太多字符。通过 looahead 解决这个问题:

/ATG(?=([ACTG]*+TAG))/g;

然后print "ATG$1\n",输出:

ATGGCCCATGATGCATCGACTAG
ATGATGCATCGACTAG
ATGCATCGACTAG
ATGTCGATCGATACAGCTAATAG
于 2013-08-30T09:38:34.810 回答
0

如果您想在同一帧中包含起始密码子和终止密码子,请不要忘记将结果过滤为长度为 3 的唯一密码子:

print "ATG$1\n" if (length($1)%3) == 0 ;

如果您想检查一个序列中可用的六个帧,请不要忘记检查互补链:

$comp_chain = reverse($chain) ;
$comp_chain =~ tr/ATCG/TAGC/ ;

然后,您将从单个序列中可用的六个阅读框中获得开放阅读框。

于 2013-08-30T10:56:13.743 回答