1

我正在使用 perl 和正则表达式来查找最小大小为 45 个碱基的 ORF(开放阅读框)。基本上它的意思是: 找到一个子串 一个仅由字母 ATGC(没有空格或换行符)组成的字符串:

  1. 以“ATG”开头
  2. 以“TAG”或“TAA”或“TGA”结尾,
  3. 至少有 39 个字符长
  4. 可被 3 整除

我的第一个代码是:

$CDSString = "ATGCACACACACACACACACACACACACACACACACACACACACACACACACACACATGA";
if($CDSString =~ m/(ATG.{45,}(TAG|TAA|TGA))/) 
{
    my $CDSCurrent = $1;
    if ((length($CDSCurrent) % 3) == 0)
    { 
        # do something
    }
}

效果很好,但我认为可能有更好的方法。所以我尝试了:

$CDSString = "ATGCACACACACACACACACACACACACACACACACACACACACACACACACACACATGA";
if ($CDSString =~ m/ATG(...){13,}(TAG|TAA|TGA)/ )
{
    # do something
}

但由于某种原因,它与上面的字符串不匹配,我不知道为什么。任何人都可以弄清楚吗?先感谢您。

4

2 回答 2

1

您的正则表达式不能确保起始密码子和终止密码子之间的所有内容实际上ATGC仅由字母组成。你应该使用:

if ($CDSString =~ m/ATG(?:[ATGC]{3}){13,}(?:TAG|TAA|TGA)/i) {...}

(但是你原来的正则表达式也可以工作,它不会拒绝无效的匹配。所以其他地方可能还有另一个问题。)

于 2012-04-14T11:33:29.100 回答
0

到目前为止,代码存在问题。您应该寻找的是终止密码子的第一个实例。如果您的 CDS 不好,它可能包含内部止损。内部终止密码子会产生无效的 ORF,因此您需要更巧妙的方法:

if($CDSString =~ m/ATG(?:[ATGC]{3}(?<!TAG|TAA|TGA)){13,}(?:TAG|TAA|TGA)/i) {...}

这将返回一个没有内部终止的序列,在起始和第一个终止之间至少有 13 个密码子。

这部分代码:(?:[ATGC]{3}(?<!TAG|TAA|TGA))说“匹配三个不是 TAG、TAA 或 TGA 的核苷酸”。这 (?

以下是它的实际效果:

perl -e '$CDSString = "ATGCACACACACACACACACACACACACACACACACACACACACACACACACACACATAGTAGTAGTGA";if ($CDSString =~ m/(ATG(?:[ATGC]{3}(?<\!TAG|TAA|TGA)){13,}(TAG|TAA|TGA))/ ){print "$1\n"}'
ATGCACACACACACACACACACACACACACACACACACACACACACACACACACACATAG

请注意,最后 3 个终止密码子 (TAGTAGTGA) 不会作为序列的一部分返回。

于 2015-09-09T18:24:44.553 回答