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

Python 识别打开的阅读框时,仅返回re.finditer中最长的匹配项,python,regex,bioinformatics,Python,Regex,Bioinformatics,我正试图编写代码,识别DNA序列中的开放阅读框。ORF被定义为序列的一部分,以ATG开始,以终止密码子标签、TAA或TGA结束。我使用了一个前瞻表达式来查找重叠序列。但是,我只希望打印最长的字符串 (?=(ATG(?:[ATGC]{3}){%d,}?(?:TAG|TAA|TGA)))' % (aa) 非溶液 只需删除“向前看”。匹配将消耗文本,并禁止再次匹配匹配的文本(这会产生额外的不需要的结果) 我假设您的要求是查找所有序列,除了那些以相同索引结束但比现有序列短的序列 解决方案1:在当

我正试图编写代码,识别DNA序列中的开放阅读框。ORF被定义为序列的一部分,以ATG开始,以终止密码子标签、TAA或TGA结束。我使用了一个前瞻表达式来查找重叠序列。但是,我只希望打印最长的字符串

(?=(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
模块中,无法使用支持级别强制执行唯一的结束位置


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

那么不要使用“向前看”。aa参数的含义是什么?@zero323:start和end之间的最小密码子数我已尝试使用不同的方法进行类似的搜索(首先翻译六个帧,寻找最长的M...*片段)。你的序列是一个可能有一个ORF的转录本,还是一部分基因组将有一组基因?在后一种情况下,你将对可能产生嵌合输出的帧移非常敏感……这是一个相关的(相同的?)问题…您可能想从
{%d,}中删除
。仍然可能存在位于不同帧中的ORF,因此可能会重叠。例如:Atgaatgaaaaaataaaaokay,我明白了。我不明白的是,为什么您首先要使用前瞻。@Alanmore:他只是举例说明。@gr8skillz:如果您想要最长的匹配(仅1),然后只需使用原始正则表达式,并从所有匹配项中选择最长的一个。
'(?=((?:GAT|AAT|AGT)(?:(?!GAT|AAT|AGT)[ATGC]{3}){%d,}GTA))' % (aa)