[英]Using lists with re (Or how to delete a substring between a list of possible codons)
我正在編寫一個腳本來從一系列基因中刪除開放閱讀框。 我知道re
模塊,但我不太明白它在涉及列表時的正確用法 - 這是我的任務:
我需要在基因中找到起始密碼子'AUG'
然后我需要找到存儲在列表中的 3 個可能的終止密碼子之一的出現
stop_codons = ['TAG', 'TAA', 'TGA']
然后我需要刪除起始密碼子和終止密碼子之間的所有其他字符。
我實現了一些接近的東西:
gene = 'AUGGTAAATTGAUUGUTAUTAUTGTAGTGATGU'
re.sub('AUG.+TAG', '', gene)
但是我覺得必須有比為每個終止密碼子寫一行並循環通過預定義列表更好的形式(一些線粒體基因組和細菌基因組具有替代的起始/終止密碼子,我希望代碼很容易適當時修改以包括那些密碼子)。
我怎樣才能用 re 實現這一點?
下面的代碼應該符合您的意思。 它查找出現,然后在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)
您的代碼還削減了 output 中的start_codon
和stop_codon
。 我不知道這是否是你想要達到的。 如果是這樣,只需將cut_gene
變量替換為 for 循環中的 re.sub 示例行,如下所示:
re.sub(f'{start_codon}.+{stop_codons_item}', '', gene)
首先,請注意re
嘗試匹配最大可能的 substring。 這意味着天真的方法不會在第一個“結束”密碼子處停止,而是在最后一個密碼子處停止:
start end1 end2
vvv vvv vvv
>>> gene = 'AUGGTAAATTGAUUGUTAUTAUTGTAGTGATGUTAGG'
>>> re.sub('AUG.+TAG', '', gene)
'G'
更好的:
>>> re.sub('AUG.+?TAG', '', gene)
'TGATGUTAGG'
您可以通過在正則表達式中使用“A 或 B”類型的表達式來避免多次迭代字符串,這看起來像(A|B)
。 在您的示例中:
start end
vvv vvv
>>> gene = 'AUGGTAAATTGAUUGUTAUTAUTGTAGTGATGUTAGG'
>>> re.sub('AUG.+?(TAG|TAA|TGA)', '', gene)
'TGATGUTAGG'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.