首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用re列表(或如何删除可能的密码子列表之间的子字符串)

使用re列表(或如何删除可能的密码子列表之间的子字符串)
EN

Stack Overflow用户
提问于 2021-04-27 11:57:59
回答 2查看 67关注 0票数 1

我正在写一个脚本,从一系列基因中删除打开的阅读框。我知道re模块,但我不太明白当涉及到列表时它的正确用法--以下是我的任务:

  1. I需要在

基因中找到起始密码子'AUG'

然后,

  1. I需要找到存储在列表中的三个可能的停止密码子中的一个。

stop_codons = ['TAG', 'TAA', 'TGA']

然后,

  1. I需要删除开始和停止密码子之间的所有其他字符.

我取得了一些接近的成就:

代码语言:javascript
运行
复制
gene = 'AUGGTAAATTGAUUGUTAUTAUTGTAGTGATGU'
re.sub('AUG.+TAG', '', gene)

然而,我觉得一定有更好的方法,而不是为每个终止密码子写一行,在预先定义的列表中循环将是更好的形式(一些线粒体基因组和细菌基因组有可供选择的起始/终止密码子,我希望代码能够在适当的时候被轻松修改以包括这些密码子)。

我怎样才能用re实现这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-27 22:03:14

首先,请注意,re试图匹配最大的子字符串。这意味着,天真的做法不会停留在第一个“结束”密码子,而是最后一个:

代码语言:javascript
运行
复制
            start                   end1     end2
            vvv                     vvv      vvv
>>> gene = 'AUGGTAAATTGAUUGUTAUTAUTGTAGTGATGUTAGG'
>>> re.sub('AUG.+TAG', '', gene)
'G'

更好的是:

代码语言:javascript
运行
复制
>>> re.sub('AUG.+?TAG', '', gene)
'TGATGUTAGG'

通过在regex中使用"A或B“类型的表达式,可以避免多次迭代字符串,这类似于(A|B)。在你的例子中:

代码语言:javascript
运行
复制
          start end
            vvv vvv
>>> gene = 'AUGGTAAATTGAUUGUTAUTAUTGTAGTGATGUTAGG'
>>> re.sub('AUG.+?(TAG|TAA|TGA)', '', gene)
'TGATGUTAGG'
票数 0
EN

Stack Overflow用户

发布于 2021-04-27 12:53:05

下面的代码应该符合您的意思。它寻找发生,然后打印切割基因之间的字符之间的开始和停止密码子在stop_codons列表中的每一项。

代码语言:javascript
运行
复制
import re

gene = 'AUGGTAAATTGAUUGUTAUTAUTGTAGTGATGU'
start_codon = 'AUG'
stop_codons = ['TAG', 'TAA', 'TGA']

for stop_codons_item in stop_codons:
  cut_gene = re.sub('(?<=%s).*?(?=%s)' % (start_codon,stop_codons_item), '', gene)
  print(cut_gene)

您的代码还会在输出中减少start_codonstop_codon。我不知道这是不是你想要达到的目标。如果是这样,只需在for循环中用cut_gene示例行替换re.sub变量,如下所示:

代码语言:javascript
运行
复制
re.sub(f'{start_codon}.+{stop_codons_item}', '', gene)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67282629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档