目的是在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只返回被剪切的而不是剩下的。 感谢
答案 0 :(得分:3)
根据您发布的链接
胰蛋白酶的切割规则是:在R或K之后,但不在P之前(即胰蛋白酶在每个K或R之后切割(切割)蛋白质序列,除非(K或R)之后是P)。
这可以实现如下:
K
或R
之一(P
后面没有)。在正则表达式中,这看起来像这样:
>>> 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