+ -
当前位置:首页 → 问答吧 → 小心_正则表达式,求解正则的原理

小心_正则表达式,求解正则的原理

时间:2011-09-04

来源:互联网

我是学生物的,最近有段mRNA序列(如下)。我们组有个成员要求从这段序列识别出特定的碱基组合“AA(19个任意碱基)

TT”【就是23个ATCG字符组合成的一段序列,但是必须以AA开头,TT结束】。

开始程序设计比较复杂:
(1)
Python code
n='GTCTATAATTTCATTTTTGTCTAGGCTGGTGAGAGCTCCGCTTGTTCCGTAAAGTGGATGTCAGGTGGATCTATGTTCTGCGAGGAACAAAGAGGCAGCGAAGGCAGCGCGGGGGAAGTTTGAGCGGCGAGGATGCAGGCTGTGTACTGGTGCGCGGTCCTCCTGCTGCAGCCCACCCTCTACTTGGTTACCTGTGCAAATTTAACAAATGGAGGTAAATCAGAACTTCTAAAATCAGGAAGCTCCAAATCCACACTAAAGCACATATGGACAGAAAGTAGCAAAGACTTGTCCATCAGCCGACTGCTGTCACAGACTTTTCGTGGAAAGGAGAATGATACAGATTTGGACCTGCGATATGATGCCCCAGAAACTTATACTGAGCAAGATCTCTGGGACTGGCTGAGGAACTCCACAGACCTTCAAGAACCTCGGCCCAGGGCAAAGAGACGGCCCATTGTCAAGACTGGGAAATTTAAGAAAATGTTTGGCTGGGGCGATTTTCATTCCAACATCAAGACTGTGAAGCTAAATCTGTTAATAACAGGGAAAATTGTTGACCATGGCAATGGGACGTTTAGCGTTTACTTCAGGCATAACTCCACTGGTCAAGGGAATGTATCTGTGAGCCTAGTGCCCCCTACAAAAATAGTGGAATTTGACTTGGCACAACAGACAGTGATTGATGCCAAAGATTCCAAGTCCTTTAACTGTCGAATTGAGTATGAAAAGGTTGACAAGGCTACCAAGAACACACTCTGCAACTATGACCCTTCAAAAACCTGTTATCAGGAGCAGACCCAGAGCCACGTGTCATGGCTCTGCTCCAAGCCCTTTAAAGTAATCTGTATTTACATTTCGTTTTATAGTACAGATTATAAACTAGTACAGAAGGTGTGTCCTGATTACAACTACCACAGTGACACACCCTACTTCCCCTCAGGGTGAGGATGAACGTGTCTGAGACTGAAGCCTGGGGAATAAAAGAATTCGTATGACAGGGCTGTAACCTCAAGGAGGAAAGCCACATCTATTGCCTGGAATGTGTCTACCTGCTGCTGCTGATGTCATATGGCTGCAAATATGTTAGTGGAAAACAATCTAATGTAATTTTTGCCCAGTCAGCACCATGTATCAATCTAGTTGTAAATCACTATGGATTTGAAATAAAACCATACACACACACACAGAGACACACACTCTTTTCAGCTCATATCTATTGAGATTCCTGTTAAGAGAGATTTTCACTGTCTGATAACTAAGGTTTTGGGATAAACTATCATCAAGCAAAATGGATTAACTAGACAGAGAACAGTTTCTAACACAGACTATTGTGGAAATCTCTTTGAAAGTCCTTTGAGTGTATACCAATAATCCCCACTCATGCGTTCTACTGCTTGGAGTAGCTGTACCGGTAAATAATACTGTAGGAGTAAATACTTGTTAAAATGGGAAAAATGTGTGTCTAGAGTTCAGTATTCCTTGCTATATGAACACAGTAAAGCATAGTGACTTTTTTCCAGCATACAGTAGGCACATTCAAGGTGGTGTTAGGTGGCTCTTTTTCCATGGAGCGAGCCTGTTACCAGTAAAGATGGGCAAACATTTGGAATTTACATGTGGGCAGACATCCTGGTTTTATGTTTCTCTGACTCTTTAAGCTCTGATTCTTTAAACCTGGTTGAGTTTAGTCAAGCAAAGCTATTTTAAAACCCTCTAAATGATCTTTAGGAAGGAAAATGCCTCATGGAGGACATGTAAGTTATAAGTGGCTGTCTTATCTTTATTACAAAATATTGTAACAAATTCAATATCCTAGTCTTGATTTGTATGAATGGTTTGTATTGTACATAATTTAACCAGTGTTATTTGAGCTGCTTATTAATATTAACTTGTAATTGTCTCTCTGCTTGTTATTGGTTAAAAACAATTGAGGAAATGAGGAATCCATTTTATCAATGTAGCTGTAAACTCATTAAAAGACAGAACTATGTACAAAGCATTTATTCAGCTAAAGTATTGTTGAAAGCTAAACATATACAAC'
# 将碱基导入空列表
newli=[]
for i in n:
    newli.append(i)

# 逐个查找符合条件的序列
for i in range(len(newli)):
    if ''.join(newli[i:i+2]) == 'AA' and ''.join(newli[i+21:i+23])=='TT':
        print ''.join(newli[i:i+23])

最后获得14个满足条件的序列如下

'''
AAAATGTTTGGCTGGGGCGATTT
AAATGTTTGGCTGGGGCGATTTT*
AAGACTGTGAAGCTAAATCTGTT
AATGGGACGTTTAGCGTTTACTT
AATCTGTATTTACATTTCGTTTT
AACAGTTTCTAACACAGACTATT
AACACAGTAAAGCATAGTGACTT
AAGGTGGTGTTAGGTGGCTCTTT
AAGATGGGCAAACATTTGGAATT
AACAAATTCAATATCCTAGTCTT
AATTCAATATCCTAGTCTTGATT*
AATGGTTTGTATTGTACATAATT
AACCAGTGTTATTTGAGCTGCTT
AACTTGTAATTGTCTCTCTGCTT
'''



虽然这个方法比较复杂但事情终于做完了,后来打算尝试一下怎么用正则表达式搞定。因为一直对正则应用不熟,不得不锻炼一下。
(2)正则的尝试
Python code
import re
find = re.findall(r'AA\w{19}TT',n)
if find:
    for i in find:
        print i
    print len(find)

问题是应用正则只识别出12条序列满足条件
'''
AAAATGTTTGGCTGGGGCGATTT
AAGACTGTGAAGCTAAATCTGTT
AATGGGACGTTTAGCGTTTACTT
AATCTGTATTTACATTTCGTTTT
AACAGTTTCTAACACAGACTATT
AACACAGTAAAGCATAGTGACTT
AAGGTGGTGTTAGGTGGCTCTTT
AAGATGGGCAAACATTTGGAATT
AACAAATTCAATATCCTAGTCTT
AATGGTTTGTATTGTACATAATT
AACCAGTGTTATTTGAGCTGCTT
AACTTGTAATTGTCTCTCTGCTT

'''


作者: hebgm   发布时间: 2011-09-04

中间有重叠吧。re.findall的所有结果,是不能用重叠的。
Python code

import re
print re.findall(r'A{2}', 'AAAA')
print re.findall(r'AA\w{4}TT', 'AAAAXXYYTTTT')


作者: iambic   发布时间: 2011-09-04

现在的问题是为什么正则表达式少识别了两段序列呢【(1)结果“*”表示的序列】?后来仔细观察后发现是“AAAATGTTTGGCTGGGGCGATTTT”这个片段在作怪。对于这段序列其实包含了两条满足条件的序列片段:从第一个A处开始和从第二个A开始都满足条件,因为后边有四个T。

那么为什么正则没有在识别出一条满足条件的序列后再移动一个字母A继续匹配呢?是我的表达错误吗?实在不清楚正则表达的原理,求高人指点!

作者: hebgm   发布时间: 2011-09-04