2

目的是在 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 只返回那些被剪掉的,而不是剩下的。谢谢

4

3 回答 3

3

根据您发布的链接

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

这可以按如下方式实现:

  1. 匹配一个字符。
  2. 在匹配下一个字符之前,请检查最后一个字符是否不是拆分KR(后面没有P)。
  3. 然后消耗下一个字符。
  4. 重复步骤 2 和 3。

在正则表达式中,这看起来像这样:

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

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

于 2013-08-21T17:59:46.203 回答
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'}

这是教程中的相关部分

如果您对它当前的实现方式感兴趣,请查看源代码

@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
于 2013-08-21T18:03:49.687 回答
-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    
于 2014-03-12T23:19:48.590 回答