Regex 使用perl正则表达式查找最小大小为45个碱基的ORF-为什么这个正则表达式不';行不通

Regex 使用perl正则表达式查找最小大小为45个碱基的ORF-为什么这个正则表达式不';行不通,regex,perl,Regex,Perl,我正在使用perl和正则表达式查找一个最小大小为45个碱基的ORF(开放阅读框架)。 基本上是指: 查找仅由字母ATGC(无空格或新行)组成的子字符串: 以“ATG”开头 以“TAG”或“TAA”或“TGA”结尾 至少有39个字符长 可除以3 我的第一个代码是: $CDSString = "ATGCACACACACACACACACACACACACACACACACACACACACACACACACACACATGA"; if($CDSString =~ m/(ATG.{45,}(TAG|TAA|TGA

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

  • 以“ATG”开头
  • 以“TAG”或“TAA”或“TGA”结尾
  • 至少有39个字符长
  • 可除以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
    }
    
    但由于某种原因,它与上面的字符串不匹配,我也不明白为什么。
    有人能猜出来吗?提前谢谢。

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

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

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

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

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

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

    到目前为止,代码存在问题。你应该寻找的是第一个终止密码子。如果您的CD不好,它可能包含内部停止。内部终止密码子产生无效的ORF,因此需要更精细的处理:

    if($CDSString =~ m/ATG(?:[ATGC]{3}(?<!TAG|TAA|TGA)){13,}(?:TAG|TAA|TGA)/i) {...}
    
    if($CDSString=~m/ATG(?[ATGC]{3}(?)?
    这将返回一个没有内部终止的序列,该序列在起始和第一个终止之间至少有13个密码子

    这部分代码:
    (?:[ATGC]{3}(?)表示“匹配三个不是TAG、TAA或TGA的核苷酸”?
    下面是它在实际中的表现:

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

    perl-e'$CDSString=“atgcacacacacacatagtagtagtga”;如果($CDSString=~m/(ATG(?[ATGC]{3}(?到目前为止,代码存在问题。您应该寻找的是第一个停止密码子实例。如果CD不好,它可能包含内部停止。内部停止密码子生成无效的ORF,因此您需要更精细的处理:

    if($CDSString =~ m/ATG(?:[ATGC]{3}(?<!TAG|TAA|TGA)){13,}(?:TAG|TAA|TGA)/i) {...}
    
    if($CDSString=~m/ATG(?[ATGC]{3}(?)?
    这将返回一个没有内部终止的序列,该序列在起始和第一个终止之间至少有13个密码子

    这部分代码:
    (?:[ATGC]{3}(?)表示“匹配三个不是TAG、TAA或TGA的核苷酸”?
    下面是它在实际中的表现:

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

    perl-e'$CDSString=“atgcacacacacacatagtagtagtga”;如果($CDSString=~m/(ATG(?[ATGC]{3}(?它现在似乎对我起作用了。奇怪。我可以发誓它以前不起作用。谢谢你的帮助它现在似乎对我起作用了。奇怪。我可以发誓它以前不起作用。谢谢你的帮助谢谢你的改进,我没有想过处理非ATGC chars!我不知道为什么它现在和以前对我起作用。谢谢对于改进,我没有考虑处理非ATGC字符!我不知道为什么它现在和以前对我有效。