正则表达式匹配mRNA序列

Sia*_*ian 6 python regex bioinformatics jupyter-notebook

在真核生物中,剪接mRNA具有三个关键特性:

  1. mRNA以起始密码子(ATG)开始
  2. mRNA的编码部分以三个终止密码子之一(TAA/TAG/TGA)结束
  3. 在终止密码子后立即存在'poly(A)尾'.poly(A)尾是在转录后连接到编码序列的3'末端的许多腺嘌呤(A')的序列.实际上,poly(A)尾部可能有数百个A,但通常mRNA/cDNA的末端未完全测序,因此终止密码子后可能只有5个A.

所以基本上,mRNA序列应该以ATG开始,然后是任意数量的As,Cs,Ts或Gs,然后是TAA或TAG或TGA,然后是5或更多的As.

我的(python)正则表达式是这样的: ^ATG[ATCG]*T(AA|AG|GA)A{5}A*$

然而,这是匹配序列,其在poly(A)尾部之后具有另外的字符,就好像$字符未被识别一样.我究竟做错了什么?

有效示例:

ATGCTGATGATGATGATAGAAAAA
ATGTGAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Run Code Online (Sandbox Code Playgroud)

无效的示例:

ATGCTGATGXTGATGATAGAAAAA
TATGCTGATGXTGATGATAGAAAAA
ATGTGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC
Run Code Online (Sandbox Code Playgroud)

编辑(我的完整代码):

file = open('potential_mRNA.fasta')
alignment = SeqIO.parse(file, 'fasta')
mRNA_seqs = []
mRNA_pattern = r'^ATG[ATCG]*T(AA|AG|GA)A{5}A*$'
for mrna in alignment:
    sequence = str(mrna.seq)
    if re.search(mRNA_pattern, sequence):
        mRNA_seqs.append(sequence)
Run Code Online (Sandbox Code Playgroud)

nec*_*qua 2

它是这样工作的,因为第一个*是贪婪的,并尝试尽可能多地匹配,匹配所有后缀,并且正则表达式解析器永远不会超出解析范围[ATCG]

然而,应该$使它按照您的预期工作,因此您的正则表达式对于您的任务完全有效,也许存在一些我在您的问题中看不到的未知条件。

尝试^ATG[ATCG]*?T(?:AA|AG|GA)A{5,}$

我使用了惰性*?而不是*,并且还使用了非捕获组(?:)A{5,}不是仅仅A{5}A*为了优化。