使用Python正则表达式拆分非重叠字符组(ORF发现)

Ian*_*des 5 python regex

我正在寻找一种漂亮的pythonic方法来找到DNA序列中的开放阅读框架.我发现许多在线实现使用索引,标志和其他这样的丑陋.

我很确定可以创建正则表达式实现,但我对正则表达式不好.一般的想法是我想通过'ATG','TAG','TGA'和'TAA'分割出一串DNA序列.但是我不想在重叠区域上分裂,例如序列'ATGA'应该分成'ATG','A'.基本上在三个框架中的每个框架中从左到右.

为清晰起见编辑:如评论中所述,尽管存在(在非零帧中),但ATGATTTTGA应该将一个序列拆分为ATG,TTTTGATGA

edit2:这就是我在没有正则表达式的情况下使用list comprehension splitting链接实现的方法.我讨厌使用旗帜.

def find_orf(seq):
    length = 0
    stop = ['TAA','TGA','TAG']
    for frame in range(3):
        orfFlag, thisLen = None, 0
        splitSeq = [seq[start+frame:start+frame+3] for start in range(0,len(seq),3)]
        for codon in splitSeq:
            if codon == 'ATG':
                orfFlag = True
                thisLen += 1
            elif orfFlag and codon in stop:
                orfFlag = None
                if thisLen > length:
                    length = thisLen
            else:
                thisLen += 1
    return length
Run Code Online (Sandbox Code Playgroud)

evo*_*obe 2

我不确定你建议的正则表达式方法是否特别Pythonic,但基本的正则表达式:

import re
v=re.compile("((ATG)|(TGA)|(TAG)|(TAA))")
test="CCATGACCCATGCACCATTGAC"
for i in v.findall(test):
   print i
Run Code Online (Sandbox Code Playgroud)

确实错过了属于 ATGA 一部分的第一个 TGA,并且只报告了第二个。一般来说,这不会起作用,因为你必须假设你的基因框架,而这可能是提前不知道的。

一种非常易读的方法是简单地对所有三个阅读框架进行列表理解。