我正在写一个脚本,从一系列基因中删除打开的阅读框。我知道re
模块,但我不太明白当涉及到列表时它的正确用法--以下是我的任务:
基因中找到起始密码子'AUG'
然后,
stop_codons = ['TAG', 'TAA', 'TGA']
然后,
我取得了一些接近的成就:
gene = 'AUGGTAAATTGAUUGUTAUTAUTGTAGTGATGU'
re.sub('AUG.+TAG', '', gene)
然而,我觉得一定有更好的方法,而不是为每个终止密码子写一行,在预先定义的列表中循环将是更好的形式(一些线粒体基因组和细菌基因组有可供选择的起始/终止密码子,我希望代码能够在适当的时候被轻松修改以包括这些密码子)。
我怎样才能用re实现这一点呢?
发布于 2021-04-27 22:03:14
首先,请注意,re
试图匹配最大的子字符串。这意味着,天真的做法不会停留在第一个“结束”密码子,而是最后一个:
start end1 end2
vvv vvv vvv
>>> gene = 'AUGGTAAATTGAUUGUTAUTAUTGTAGTGATGUTAGG'
>>> re.sub('AUG.+TAG', '', gene)
'G'
更好的是:
>>> re.sub('AUG.+?TAG', '', gene)
'TGATGUTAGG'
通过在regex中使用"A或B“类型的表达式,可以避免多次迭代字符串,这类似于(A|B)
。在你的例子中:
start end
vvv vvv
>>> gene = 'AUGGTAAATTGAUUGUTAUTAUTGTAGTGATGUTAGG'
>>> re.sub('AUG.+?(TAG|TAA|TGA)', '', gene)
'TGATGUTAGG'
发布于 2021-04-27 12:53:05
下面的代码应该符合您的意思。它寻找发生,然后打印切割基因之间的字符之间的开始和停止密码子在stop_codons
列表中的每一项。
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_codon
和stop_codon
。我不知道这是不是你想要达到的目标。如果是这样,只需在for循环中用cut_gene
示例行替换re.sub变量,如下所示:
re.sub(f'{start_codon}.+{stop_codons_item}', '', gene)
https://stackoverflow.com/questions/67282629
复制相似问题