Logo
Section 1 / 5

项目1:玩转DNA(正则环视)

在本项目中,我们将借助 Python 正则表达式从 DNA 序列中找出开放阅读框(ORF)。

导入

项目1:玩转DNA(正则环视)

在本项目中,我们将借助 Python 正则表达式从 DNA 序列中找出开放阅读框(ORF)。

DNA 是由碱基 A、C、G 或 T 组成的序列。它们以每三个碱基为一组翻译成蛋白质,每组三个碱基称为一个 密码子(codon)。其中有一个特殊的起始密码子 ATG,以及三个终止密码子 TGA、TAG 和 TAA。例如:

1cgcgcATGcATGcgTGAcTAAcgTAGcgcgcgcgc

一个开放阅读框(Open Reading Frame,简称 ORF)由一个 起始密码子 开始,中间包含若干个密码子,最后以一个 终止密码子 结束。上面的例子中存在重叠的 ORF,包括:

  • ATGcATGcgTGA 和
  • ATGcgTGAcTAA。

以下正则表达式模式只能找到第一个 ORF(即 atgcatgcgtga),因为它在匹配时会“消耗”该片段,从而也占用了第二个 ORF 的开头部分。

1from re import * 2 3dna = 'cgcgcATGcATGcgTGAcTAAcgTAGcgcgcgcgc' 4dna = dna.lower() 5orfpat = r'(?x) ( atg (?: (?!tga|tag|taa) ... )* (?:tga|tag|taa) )' 6print findall(orfpat,dna)

如果我们希望找到 ORF 但不消耗匹配的文本,就可以使用 正向先行断言(positive lookahead) (?= ( atg)。我们将整个 ORF 模式放入先行断言中,这样就能同时找到两个 ORF:atgcatgcgtga 和 atgcgtgactaa。

1from re import * 2 3dna = 'cgcgcATGcATGcgTGAcTAAcgTAGcgcgcgcgc' 4dna = dna.lower() 5orfpat = r'(?x) (?= ( atg (?: (?!tga|tag|taa) ... )* (?:tga|tag|taa) ))' 6s = findall(orfpat,dna) 7if s: 8 print ', '.join(s)

该项目借鉴并简化了 Rex Dwyer 的 ipython 笔记本中的 Splitsville 示例(DNA)。

Python 惰性搜索与贪婪搜索

项目2:使用Python和正则表达式从HTML文件中解析数据