首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >胰蛋白酶摘要(cleavage)使用正则表达式不起作用

胰蛋白酶摘要(cleavage)使用正则表达式不起作用
EN

Stack Overflow用户
提问于 2011-05-29 23:58:20
回答 3查看 3.9K关注 0票数 7

我尝试在Python中编写蛋白质序列的理论胰蛋白酶切割代码。胰蛋白酶的切割规则是:在R或K之后,但不在P之前(即胰蛋白酶在每个K或R之后切割蛋白质序列,除非(K或R)后面跟着一个P)。

示例:序列MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK的切割(cut)应产生以下4个序列(肽):

代码语言:javascript
运行
复制
MVPPPPSR
GGAAKPGQLGR
SLGPLLLLLRPEEPEDGDR
EICSESK 

请注意,在第二个肽中K之后没有裂解(因为P在K之后),并且在第三个肽中在R之后没有裂解(因为P在R之后)。

我用Python编写了这段代码,但它不能很好地工作。有没有更有意义地实现这个正则表达式的方法?

代码语言:javascript
运行
复制
    # Open the file and read it line by line.

    myprotein = open(raw_input('Enter input filename: '),'r')
    if  os.path.exists("trypsin_digest.txt"):
        os.remove("trypsin_digest.txt")
    outfile = open("trypsin_digest.txt",'w+')

    for line in myprotein:
        protein = line.rstrip()
        protein = re.sub('(?<=[RK])(?=[^P])','', protein)

    for peptide in protein:
        outfile.write(peptide)
    print 'results written to:\n', os.getcwd() +'\ trypsin_digest.txt'

这就是我是如何让它为我工作的

代码语言:javascript
运行
复制
   myprotein = open(raw_input('Enter input filename: '),'r')
   my_protein = []

   for protein in myprotein:
   myprotein = protein.rstrip('\n')
   my_protein.append(myprotein)
   my_pro = (''.join(my_protein))

   #cleaves sequence    
   peptides = re.sub(r'(?<=[RK])(?=[^P])','\n', my_pro)
   print peptides

蛋白质序列:

MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK

输出(胰蛋白酶裂解位点)或肽

MVPPPPSR

GGAAKPGQLGR

SLGPLLLLLRPEEPEDGDR

EICSESK

MVPPPPSR

GGAAKPGQLGR

SLGPLLLLLRPEEPEDGDR

EICSESK

MVPPPPSR

GGAAKPGQLGR

SLGPLLLLLRPEEPEDGDR

EICSESK

EN

回答 3

Stack Overflow用户

发布于 2011-05-30 00:26:12

正则表达式很好,但这里有一个使用常规python的解决方案。由于您要在基中寻找子序列,因此将其构建为生成器是有意义的,因为生成器会生成片段。

代码语言:javascript
运行
复制
example = 'MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK'

def trypsin(bases):
    sub = ''
    while bases:
        k, r = bases.find('K'), bases.find('R')
        cut = min(k, r)+1 if k > 0 and r > 0 else max(k, r)+1
        sub += bases[:cut]
        bases = bases[cut:]
        if not bases or bases[0] != 'P':
            yield sub
            sub = ''


print list(trypsin(example))
票数 5
EN

Stack Overflow用户

发布于 2011-05-30 00:13:40

稍微修改一下你的正则表达式就可以编辑了:

在您的评论中,您提到一个文件中有多个序列(让我们称其为sequences.dat):

代码语言:javascript
运行
复制
$ cat sequences.dat
MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK
MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK
MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK

>>> with open('sequences.dat') as f:
    s = f.read()

>>> print(s)
MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK
MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK
MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK

>>> protein = re.sub(r'(?<=[RK])(?=[^P])','\n', s, re.DOTALL)

>>> protein.split()
['MVPPPPSR', 'GGAAKPGQLGR', 'SLGPLLLLLRPEEPEDGDR', 'EICSESK', 'MVPPPPSR', 'GGAAKPGQLGR', 'SLGPLLLLLRPEEPEDGDR', 'EICSESK', 'MVPPPPSR', 'GGAAKPGQLGR', 'SLGPLLLLLRPEEPEDGDR', 'EICSESK']

>>> print protein
MVPPPPSR
GGAAKPGQLGR
SLGPLLLLLRPEEPEDGDR
EICSESK

MVPPPPSR
GGAAKPGQLGR
SLGPLLLLLRPEEPEDGDR
EICSESK

MVPPPPSR
GGAAKPGQLGR
SLGPLLLLLRPEEPEDGDR
EICSESK
票数 3
EN

Stack Overflow用户

发布于 2011-05-30 00:16:40

我相信下面的regexp将会如您所描述的那样:

代码语言:javascript
运行
复制
([KR]?[^P].*?[KR](?!P))

下面是来自pythonregexp的结果

代码语言:javascript
运行
复制
>>> regex = re.compile("([KR]?[^P].*?[KR](?!P))")
>>> r = regex.search(string)
>>> r
<_sre.SRE_Match object at 0xb1a9f49eb4111980>
>>> regex.match(string)
<_sre.SRE_Match object at 0xb1a9f49eb4102980>

# List the groups found
>>> r.groups()
(u'MVPPPPSR',)

# List the named dictionary objects found
>>> r.groupdict()
{}

# Run findall
>>> regex.findall(string)
[u'MVPPPPSR', u'GGAAKPGQLGR', u'SLGPLLLLLRPEEPEDGDR', u'EICSESK']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6168727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档