0

我正在尝试编写代码来识别 DNA 序列中的开放阅读框。ORF 定义为以 ATG 开头并以终止密码子 TAG、TAA 或 TGA 结尾的序列的一部分。我使用了前瞻表达式来查找重叠序列。但是,我只想打印最长的字符串。

(?=(ATG(?:[ATGC]{3}){%d,}?(?:TAG|TAA|TGA)))' % (aa)
4

1 回答 1

1

无解

只需删除前瞻。匹配将消耗文本,并禁止匹配的文本再次匹配(这会产生额外的不需要的结果)。

'(ATG(?:[ATGC]{3}){%d,}?(?:TAG|TAA|TGA))' % (aa)


我假设您的要求是找到所有序列,除了那些以相同索引结束但比现有序列短的序列。

解决方案 1:在当前解决方案的基础上构建

ATG请注意,当太靠近末端密码子时,您当前的正则表达式仍将允许匹配无效序列。您仍然需要使用负前瞻来防止无效序列。那么就不再需要惰性量词了。

'(?=(ATG(?:(?!TAG|TAA|TGA)[ATGC]{3}){%d,}(?:TAG|TAA|TGA)))' % (aa)

然后,您可以对所有匹配项进行后处理并过滤掉不需要的匹配项。您应该使用相应的开始和结束索引记录所有匹配项。按结束索引对匹配项进行排序,对于每个结束索引,只保留起始索引最小的匹配项。

解决方案2:反转字符串并使用正则表达式

可以通过首先反转序列并遍历以下正则表达式的匹配来做到这一点:

'(?=((?:GAT|AAT|AGT)(?:(?!GAT|AAT|AGT)[ATGC]{3}){%d,}GTA))' % (aa)

正则表达式使用负前瞻来确保序列内没有末端密码子,并且使量词变得贪婪以获得最长的实例。

使用正常的序列顺序无法复制效果。由于您要求结束密码子的索引是唯一的,因此我利用每个索引只能有一个匹配的事实来强制执行该条件。没有办法通过re模块中的支持级别来强制执行唯一的结束位置。

regex如果使用模块,则不需要反转字符串。您只需要设置REVERSE标志即可使用与上述相同的正则表达式启用反向搜索(未测试)。

于 2013-09-09T22:47:35.153 回答