簡體   English   中英

使用帶有 re 的列表(或者如何在可能的密碼子列表之間刪除 substring)

[英]Using lists with re (Or how to delete a substring between a list of possible codons)

我正在編寫一個腳本來從一系列基因中刪除開放閱讀框。 我知道re模塊,但我不太明白它在涉及列表時的正確用法 - 這是我的任務:

  1. 我需要在基因中找到起始密碼子'AUG'

  2. 然后我需要找到存儲在列表中的 3 個可能的終止密碼子之一的出現

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

  3. 然后我需要刪除起始密碼子和終止密碼子之間的所有其他字符。

我實現了一些接近的東西:

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_codonstop_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM