我正在寻找一种漂亮的pythonic方法来找到DNA序列中的开放阅读框架。我发现许多在线实现使用索引,标记和其他这样的丑陋。
我很确定可以创建正则表达式实现,但我对正则表达式不好。一般的想法是我想通过'ATG','TAG','TGA'和'TAA'分割出一串DNA序列。但是我不想在重叠区域上分裂,例如序列'ATGA'应该分成'ATG','A'。基本上在三个框架中的每个框架中从左到右。
为了清晰起见进行编辑:如评论中所述,尽管存在{{1},但ATGATTTTGA
等序列应分为ATG
,TTT
,TGA
(在非零帧中)
edit2:这就是我在没有正则表达式的情况下使用list comprehension splitting链接实现的方法。我讨厌使用旗帜。
TGA
答案 0 :(得分:2)
我不确定你建议的正则表达式方法是特别pythonic,但基本的正则表达式:
import re
v=re.compile("((ATG)|(TGA)|(TAG)|(TAA))")
test="CCATGACCCATGCACCATTGAC"
for i in v.findall(test):
print i
错过第一个属于ATGA的TGA,只报告第二个。一般来说,虽然这不起作用,因为你将不得不假设基因的框架,这可能是未知的。
一种非常易读的方法是简单地对所有三个阅读框进行列表推导。
答案 1 :(得分:0)
我推荐一台发电机。非常漂亮且易于理解/维护而不涉及正则表达式,这是将字符串拆分成块的错误工具:
def chunks(s, n):
"""Produce `n`-character chunks from `s`."""
for start in range(0, len(s), n):
yield s[start:start+n]
chars = "ATGAAATAA"
for chunk in chunks(chars, 3):
print chunk
输出:
ATG
AAA
TAA
在这里试试:http://ideone.com/4yQw4y
该算法的实施完全归功于此答案: Split string by count of characters
答案 2 :(得分:0)
仍然不确定你是否只想要3个字母的所有序列,或者你只想要特定的三个字母序列。但是,一系列字符的正则表达式匹配将“消耗”这些字符,而不会与后续的正则表达式搜索重叠匹配的字符,因此:
如果你想要第一个:
r = re.compile('[ATG]{3}')
r.findall('ATGAAATAA')
如果你想要第二个:
r = re.compile('(ATG|TAG|TGA|TAA|AAA)')
r.findall('ATGAAATAA')
两者都返回:['ATG','AAA','TAA']
我确实冒昧地在第二场比赛中将AAA添加到比赛序列中。