基因组中的正则表达式的应用

        在前面关于计算限制性核酸内切酶切割DNA后的片段大小那篇介绍了用find()函数,查找目标DNA上酶切片段的位置和被切割后的DNA片段大小。在这当中,我们构建了一个关于限制性核酸内切酶的字典,构建代码如下:

restrictionEnzymes['bamH1'] = ['ggatcc',0]

        但这种构建方法在遇到较为复杂的限制性核酸内切酶时,可能会遇到困难。当限制性核酸内切酶在给定位置上存在多个识别位点时,例如限制性核酸内切酶Nci1 可以识别的DNA序列为:CC(C或G)GG,并在第二个碱基C后面进行切割DNA。那么我们如何将这种限制性核酸内切酶加入到字典里面呢?

方法一:构建可能存在的两个变体CCCGG和CCGGG,然后进行两次搜索。但这种方法十分低效,因为针对每个序列的变体都要运行整个代码进行搜索。想象一下对具有识别位点CC(A或T或G或C)GG这样的scrF1限制性核酸内切酶进行操作,显然是太麻烦了。这时就应选择方法二。

restrictionEnzymes['nci1-1'] = ['cccgg',2]
restrictionEnzymes['nci1-2'] = ['ccggg',2]

方法二:运用正则表达式。

import re

#定义空字典,用于存储限制性核酸内切酶
restrictionEnzymes = {}
#往字典中添加限制性核酸内切酶
restrictionEnzymes['bamH1'] = ['ggatcc',0]
restrictionEnzymes['sma1'] = ['cccggg',2]
restrictionEnzymes['nci1'] = ['cc[cg]gg',2]
restrictionEnzymes['scrF1'] = ['cc[atcg]gg',2]

sequence1 = 'atatatccgggatatatcccggatatat'
#用re模块的findall的方法进行搜索
print(re.findall(restrictionEnzymes['bamH1'][0],sequence1))
print(re.findall(restrictionEnzymes['nci1'][0],sequence1))
print(re.findall(restrictionEnzymes['scrF1'][0],sequence1))

=====================运行结果======================
[]
['ccggg', 'cccgg']
['ccggg', 'cccgg']

        BamH1的正则表达式只是简单的字符串:‘ggatcc’

        Nci1scrF1的正则表达式则包含由方括号([ ])定义的位置,方括号内包含了一组字符。这是用于指定模式中该位置允许插入哪些字符的正则表达式语法,例如:'cc[cg]gg'的意思是“cc后跟c或g,然后跟gg”, 'cc[atcg]gg'的意思是 “cc后跟a或t或c或g,然后跟gg”。

        然后用re模块的findall的方法进行搜索。

        事实上,还有更简单的正则表达式,就是用英文的句点 (.) 表示,正则表达式中的句点表示任何字符都可以匹配该位置,而在我们的DNA序列中,这一句点就表示atgc中的任何一个。但在这里要小心,因为它也接受那些不是DNA序列元素的字符。 

restrictionEnzymes['nci1'] = ['cc.gg',2]

        现在,让我们重新回到re.findall()的结果,发现返回的只是找到的酶切序列,但总感觉缺少一些东西,比如酶切位点在目标DNA中的位置等等。这时我们就需要用到re.finditer()的方法,但是re.finditer()并不会像re.findall()那样返回一个简单的列表,re.finditer()放回的是一个可迭代的对象。下面以寻找启动子为例子进行详解,代码如下:

#细菌启动子一般的结构与特征是:-35区(ttgac)+中间15至25个碱基(.{15,25})+-10区(tataat)
promoter = 'ttgaca.{15,25}tataat'
sequence2 = 'ccccccttgacacccccccccccccccccccctataatccccc'
sequence3 = 'ccccccttgacacccccccccccccccccccccccctataatccccc'
print(re.findall(promoter,sequence2))
print(re.findall(promoter,sequence3))

print(re.finditer(promoter,sequence2))
===========================运行结果====================
['ttgacacccccccccccccccccccctataat']
['ttgacacccccccccccccccccccccccctataat']
<callable_iterator object at 0x01F7E6E8>

         既然re.finditer()返回的是可迭代的对象,那么我们如何访问这一对象? 代码如下:

promoter = 'ttgaca.{15,25}tataat'
sequence2 = 'ccccccttgacacccccccccccccccccccctataatccccc'


matches = re.finditer(promoter,sequence2)
for i in matches:
    print(i.group())
    print(i.start(),i.end())

======================运行结果===================
ttgacacccccccccccccccccccctataat
6 38
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值