在识别开放阅读框时,仅返回re.finditer中最长的匹配项

时间:2013-09-09 22:35:14

标签: python regex bioinformatics

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

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

1 个答案:

答案 0 :(得分:1)

非溶液

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

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


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

解决方案1:建立在当前解决方案之上

请注意,当ATG距离末端密码子太近时,您当前的正则表达式仍然会允许无效序列匹配。您仍然需要使用否定预测来防止无效序列。然后不再需要 lazy 量词。

'(?=(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标志即可使用与上述相同的正则表达式进行反向搜索(未经测试)。