我正在努力寻找一种漂亮且 Pythonic 的方法来查找 DNA 序列中的开放阅读框。我在网上找到了许多利用索引、标志和其他此类丑陋的实现。
我很确定可以创建正则表达式实现,但我对正则表达式不好。一般的想法是我想用'ATG','TAG','TGA'和'TAA'分割一串DNA序列。但我不想在重叠区域上拆分,例如序列“ATGA”应该拆分为“ATG”、“A”。基本上在三个框架中的一个中从左到右。
为清楚起见进行编辑:如评论中所述,尽管存在(在非零帧中),但ATGATTTTGA
应将诸如 , 之类的序列拆分为ATG
TTT
TGA
TGA
edit2:这就是我在没有正则表达式的情况下使用列表理解拆分链接实现它的方式。我讨厌使用标志。
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