Python 3-切肽正则表达式?

时间:2013-08-21 17:51:25

标签: python regex python-3.3

目的是在Python中对蛋白质序列的理论性胰蛋白酶切割进行编码。胰蛋白酶的切割(切割)规则是:在R或K之后,但不在P之前(即胰蛋白酶在每个K或R之后切割(切割)蛋白质序列,除非(K或R)之后是P)。

这是我的正则表达式:

pattern = re.compile('[KR]?[^P].*?[KR](?!P)')
peptides = pattern.findall('GGRGAGSAAWSAAVRYLTMMSSLYQT')

输出:

GGR and GAGSAAWSAAVR

我想要的是:

GGR and GAGSAAWSAAVR and YLTMMSSLYQT

Findall只返回被剪切的而不是剩下的。 感谢

3 个答案:

答案 0 :(得分:3)

根据您发布的链接

  

胰蛋白酶的切割规则是:在R或K之后,但不在P之前(即胰蛋白酶在每个K或R之后切割(切割)蛋白质序列,除非(K或R)之后是P)。

这可以实现如下:

  1. 匹配一个角色。
  2. 在匹配下一个字符之前,请检查最后一个字符是否不是分割KR之一(P后面没有)。
  3. 然后消耗下一个角色。
  4. 重复步骤2和3。
  5. 在正则表达式中,这看起来像这样:

    >>> re.findall(r".(?:(?<![KR](?!P)).)*", 'GGRGAGRPSAAWKSAAVRYLTMMSKPSLYQT')
    ['GGR', 'GAGRPSAAWK', 'SAAVR', 'YLTMMSKPSLYQT']
    

    (我不知道这是否是一个有效的序列,但它包括所有相关案例。)

答案 1 :(得分:3)

计算机肽/蛋白质的切割是典型的任务,并且已经实施。例如,您可以通过以下方式使用pyteomics(我开发):

In [1]: from pyteomics.parser import cleave, expasy_rules

In [2]: cleave('GGRGAGSAAWSAAVRYLTMMSSLYQT', expasy_rules['trypsin'])
Out[2]: {'GAGSAAWSAAVR', 'GGR', 'YLTMMSSLYQT'}

正如您所看到的,流行的分裂规则已经编码。但您可以提供自己的:

In [3]: cleave('GGRGAGSAAWSAAVRYLTMMSSLYQT', '[KR]?[^P].*?[KR](?!P)')
Out[3]: {'GAGSAAWSAAVR', 'GGR', 'YLTMMSSLYQT'}

这是the relevant section in the tutorial

如果您对目前的实施方式感兴趣,请查看source code

@memoize()
def cleave(sequence, rule, missed_cleavages=0, overlap=False):
    """
    Docstring omitted here for brevity.    
    """
    peptides = set()
    cleavage_sites = deque([0], maxlen=missed_cleavages+2)
    for i in chain(map(lambda x: x.end(), re.finditer(rule, sequence)),
                   [None]):
        cleavage_sites.append(i)
        for j in range(0, len(cleavage_sites)-1):
            peptides.add(sequence[cleavage_sites[j]:cleavage_sites[-1]])
        if overlap and i not in {0, None}:
            peptides.update(
                    cleave(sequence[i:], rule, missed_cleavages, overlap))

    if '' in peptides:
        peptides.remove('')
    return peptides

答案 2 :(得分:-1)

这是解决问题的更好方法,也是最简单的方法:

peptideo=""
proteina=raw_input("Digite a sequencia da proteina a ser digerida: ")
i=0
for i in range (0,len(proteina)):
    peptideo=peptideo+proteina[i]
    if (proteina[i]==("R") and not (proteina[i+1]=="P")):
        print "Peptideo digerido", peptideo
        peptideo=""
    if (proteina[i]==("P") and not (proteina[i+1]=="P")):
        print "Peptideo digerido", peptideo
        peptideo=""
print "Peptideo digerido", peptideo