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

标签 python regex string split bioinformatics

我有一个包含三个序列的列表,看起来或多或少像这样(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和任何 char 非贪婪 2 次或以上
  • )关闭第 1 组
  • <STOP>按字面意思匹配

查看regex demo和一个Python demo

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

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

Regex demo

例如

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)

输出

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

关于python - 从具有定义的起点和终点的字符串中提取子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67460222/

相关文章:

python - 在Python中执行sqlite3后获取修改的行数

ios - NS正则表达式组(匹配项)

php - 制作等同于 PHP 正则表达式的 JavaScript 正则表达式

Python正则表达式分割但将正则表达式匹配的结束部分放回到字符串中?

c - 给定字符串分配不同内存的原因是什么?

python - Django 用户密码的 max_length 是多少?

python - Django -- 允许用户只查看自己的页面

python - 如何告诉 HTTP 服务器不发送分块编码

c++ - gcc 4.3 的 std::string 线程安全吗?

c# - 删除不是 ASCII 32 到 175 C# 的字符的更好方法