繁体   English   中英

从具有定义的起点和终点的字符串中提取子字符串

[英]Extract substrings from a string with defined starting and ending points

我有一个或多或少看起来像这样的三个序列的列表(res):

res = [
     'NVAKMFPQRKFT<STOP>TVQTLMRNGTLLERG<STOP>CCEVSP',

     'QKRMDCNASV<STOP>TVTVQTLMQTL<STOP>TNTPKGG<STOP>',

     'MEKGYADAE<STOP>RKTF<STOP>MTVRAGCCGI<STOP>MK'
]

我想将这些序列中的每一个拆分为以“M”开头并以(但不包括)<STOP> 结尾的子字符串。 这些子串在这里被定义为外显子。 我不希望我的外显子重叠(实际序列比这里的样本长得多)。 我希望在 M 和 < STOP > 之间至少有两个字符。

   exon = list()
   for seq in res:
        string = str(res)
        result = re.search("M(.*?)<STOP>", string)
        if result:
            found = list()
            found = result.group()
            exon.append(found)
   print exon

我想得到一个这样的嵌套列表:

exon = [

     "['MFPQRKFT', 'MRNGTLLERG']",
     "['MDCNASV', 'MQTL']",
     "['MEKGYADAE', 'MTVRAGCCGI']"
]

但是现在我只得到一个带有几个外显子的列表,并且我在每个列表的末尾都有 < STOP >。

您可以使用带有捕获组和 re.findall 的模式,它将返回捕获组的值

(M.{2,}?)<STOP>
  • (捕获组 1 (这将由 re.findall 返回)
    • M.{2,}? 匹配M和 2 次或更多次任何字符非贪婪
  • )关闭第 1 组
  • <STOP>字面匹配

查看正则表达式演示Python 演示

如果您只想匹配大写字符( .匹配除换行符以外的任何字符),您可以使用

(M[A-Z]{2,})<STOP>

正则表达式演示

例如

import re

exon = list()
res = [
     'NVAKMFPQRKFT<STOP>TVQTLMRNGTLLERG<STOP>CCEVSP',
     'QKRMDCNASV<STOP>TVTVQTLMQTL<STOP>TNTPKGG<STOP>',
     'MEKGYADAE<STOP>RKTF<STOP>MTVRAGCCGI<STOP>MK'
]

for seq in res:
    exon.append(re.findall(r"(M.{2,}?)<STOP>", seq))
    
print(exon)

Output

[
  ['MFPQRKFT', 'MRNGTLLERG'],
  ['MDCNASV', 'MQTL'],
  ['MEKGYADAE', 'MTVRAGCCGI']
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM