5

我正在努力寻找一种漂亮且 Pythonic 的方法来查找 DNA 序列中的开放阅读框。我在网上找到了许多利用索引、标志和其他此类丑陋的实现。

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

为清楚起见进行编辑:如评论中所述,尽管存在(在非零帧中),但ATGATTTTGA应将诸如 , 之类的序列拆分为ATGTTTTGATGA

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
4

3 回答 3

2

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

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

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

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

于 2013-11-04T05:21:00.953 回答
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

于 2013-11-04T05:21:18.580 回答
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 添加到第二个匹配序列中。

于 2013-11-04T05:28:05.997 回答