gpt4 book ai didi

regex - perl 正则表达式 : howto get open-reading-frames without internal stop-codons?

转载 作者:行者123 更新时间:2023-12-04 04:50:18 24 4
gpt4 key购买 nike

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

通过查看 find ORF with minimal size of 45 bases using perl regular expression - why this regex doesn't work我想出了这个(所以需要调整):

    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,}但我该怎么做呢?

非常感谢提前!

编辑:

好的,在尝试了下面的建议之后,我想出了一个解决方案,它可以从给定的基因组序列中恢复所有 >=30 bp 的重叠 ORF,这些序列以 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++;
}
}
}

最佳答案

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

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

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

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

关于regex - perl 正则表达式 : howto get open-reading-frames without internal stop-codons?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17528778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com