2

我试图从字符串格式的(DNA)基因组序列的一条链中分离所有重叠的ORF(包括基因组上的开始(i)和停止(j)位置以及ORF的长度(l));ORF 应以 ATG 开头,具有至少 24 个内部核苷酸 [ACGT] 并以 (TAA|TAG|TGA) 结尾。

通过使用 perl 正则表达式查找最小大小为 45 个碱基的 ORF - 为什么这个正则表达式不起作用,我想出了这个(所以需要调整):

    my $genome = $_[0];
    my $ATG_count = 0;
    my $ORF_count = 0;
    my @i = (); 
    my @j = (); 
    my @l = (); 
    my @frames = (); 

    while ($genome =~ m/ATG/ig) {   ### I need to do this to find every ORF starting with ATG, including ORFs which are located inside other ORFs.
        $ATG_count++;
        my $start = $-[0]+1;
        foreach (substr($genome,$-[0]) =~ m/^ATG(?:[ATGC]{3}){8,}(?:TAA|TAG|TGA)/ig) {
            my $length = $+[0];
            if ($length%3 == 0) {   ### I need to do this because sadly, the above regex DOESN'T recover only Strings are dividable by 3. (Why not?!?)
                my $stop = $start+$length;
                my $readingframe = ($start%3);
                push(@i, $start), push(@j, $stop), push(@l, $length), push (@frames, $readingframe);
                $ORF_count++;
            }
        }
    }

现在,上面的代码恢复了以 ATG 开头、以 (TAA|TAG|TGA) 结尾并且 >=30 的 ORF - 我已经尝试过了 - 但是恢复的 ORF 有内部终止密码子!

我的问题是如何使恢复的 ORF 在 ATG 后的第一个终止密码子处停止?我想一种可能性是从我的正则表达式的中间部分排除 (TAA|TAG|TGA) ->(?:[ATGC]{3}){8,} 但我该怎么做呢?

提前谢谢了!

编辑:

好的,在尝试了下面的建议之后,我想出了一个解决方案,它可以从给定的基因组序列中恢复所有重叠的 ORFs > = 30 bp,这些序列以 ATG 开头并且没有内部终止密码子:

    my $genome = $_[0];
    my $ATG_count = 0;
    my $ORF_count = 0;
    my @i = (); 
    my @j = (); 
    my @l = (); 
    my @frames = (); 

    while ($genome =~ m/ATG/ig) {
        $ATG_count++;
        my $start = $-[0]+1;
        foreach (substr($genome,$-[0]) =~ m/^ATG(?:[ATGC]{3})*?(?:TAA|TAG|TGA)/ig) {    
        ### This was changed so that it matches "ATG - first(lazy) stop-codon". 
            my $length = $+[0];
            if ($length%3 == 0 && $length >=30) {    
            ### This was changed so that the matches must be >=30 in length.
                my $stop = $start+$length;
                my $readingframe = ($start%3);
                push(@i, $start), push(@j, $stop), push(@l, $length), push (@frames, $readingframe);
                $ORF_count++;
            }
        }
    }
4

3 回答 3

2

您编写的模式将贪婪地搜索密码子,直到它到达字符串中的最后一个终止密码子。尝试像这样重写你的模式:

m/ATG(?:[ATGC]{3}){8,}?(?:TAA|TAG|TGA)/ig

添加?(?:[ATGC]{3}){8,}?告诉正则表达式引擎匹配尽可能多的密码子,直到第一个停止密码子,而不是最后一个。我也会^从你的模式中省略 ,假设起始密码子不会是你序列中的第一个密码子。

至于确保返回的字符串不包含终止密码子,请将结果包装在检查终止密码子的第二个正则表达式测试中。据我所知,没有办法在单个正则表达式模式中对此进行可变长度的负后视测试。

于 2013-07-08T14:19:37.857 回答
1

尝试通过在“重复”单元 ( (?:[ATGC]{3}){8,}) 后面添加 a 来使其不延迟?

^ATG(?:[ATGC]{3}){8,}?(?:TAA|TAG|TGA)
                     ^

请参阅此处关于两个基因组的示例,第一个在最后一个终止密码子之前有一个终止密码子。

基本上,它将使“重复”单元的匹配最少,并在第一个停止密码子处停止,该密码子不在最初的 8 个单元内。

现在,如果您想在这 8 个单位内的终止密码子处停止,请不要使用,{8,}因为它表示“至少 8 个”。改为使用+,这意味着“至少 1”或*意味着至少 0。

^ATG(?:[ATGC]{3})+?(?:TAA|TAG|TGA)
                 ^

编辑:在评论中讨论之后,事实证明也有类似的字符串ATGTAA,这意味着在开始和结束密码子之间没有三元组。这就是说,使用*上面提到的将是正确的正则表达式:

^ATG(?:[ATGC]{3})*?(?:TAA|TAG|TGA)
于 2013-07-08T14:21:43.787 回答
0

我刚刚在另一个帖子中回答了这个问题。你需要的是一个否定的断言。它不必是可变宽度。从另一个帖子:

m/ATG(?:[ATGC]{3}(?<!TAG|TAA|TGA)){8,}(?:TAG|TAA|TGA)/ig
于 2015-09-09T18:44:33.957 回答