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

fnx2tebb  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(323)

我正在写一个脚本,从一系列基因中移除开放的阅读框架。我知道 re 模块,但我不太明白它在涉及列表时的正确用法-以下是我的任务:
我需要找到起始密码子 'AUG' 在基因里
然后我需要找到3个可能的终止密码子中的一个,它们存储在一个列表中 stop_codons = ['TAG', 'TAA', 'TGA'] 然后我需要删除起始密码子和终止密码子之间的所有其他字符。
我取得了一些成就:

gene = 'AUGGTAAATTGAUUGUTAUTAUTGTAGTGATGU'
re.sub('AUG.+TAG', '', gene)

然而,我觉得必须有一个更好的方法,而不是为每个终止密码子写一行,循环通过一个预定义的列表将是更好的形式(一些线粒体基因组和细菌基因组有替代的起始/终止密码子,我希望代码可以很容易地修改,以包括这些密码子时,适当的)。
如何使用re实现这一点?

ltskdhd1

ltskdhd11#

下面的代码应该符合你的意思。它寻找发生率,然后打印每个项目的起始密码子和终止密码子之间没有字符的剪切基因 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 在输出中。我不知道这是不是你想要的。如果是的话,就换一个 cut_gene 在for循环中使用re.sub示例行的变量如下:

re.sub(f'{start_codon}.+{stop_codons_item}', '', gene)
z4bn682m

z4bn682m2#

首先,请注意 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'

相关问题