背景:
如“将RNA翻译成蛋白质”中所述,蛋白质在细胞中执行所有实际功能。 蛋白质的结构和功能单位是蛋白质结构域:就蛋白质的一级结构而言,结构域是可以进化和 独立运行。
每个结构域通常对应于蛋白质的单个功能(例如,将蛋白质与DNA结合,产生 或破坏特定的化学键等)。一些蛋白质,如肌红蛋白和细胞色素复合物, 只有一个结构域,但许多蛋白质是多功能的,因此具有多个结构域。 甚至可以人为地将不同的结构域融合成具有明确性质的蛋白质分子, 产生嵌合蛋白。
就像物种一样,蛋白质可以进化,形成称为蛋白质家族的同源群体。 来自一个家族的蛋白质通常具有相同的结构域集,执行相似的功能。
对其功能至关重要的域的一个组成部分称为主题,该术语通常 与核酸的含义相同,尽管也使用了许多其他术语 (块、签名、指纹等)通常蛋白质基序在进化上是保守的, 这意味着它们在不同物种中没有太大变化。
蛋白质在世界各地的不同实验室中被鉴定,并收集到可免费访问的数据库中。 蛋白质数据的中央存储库是UniProt,它提供 详细的蛋白质注释,包括功能描述、结构域结构和翻译后修饰。 UniProt 还支持蛋白质相似性搜索、分类分析和文献引用。
https://rosalind.info/problems/mprt/
问题:
为了允许其不同形式的存在,蛋白质基序由简写表示如下: [XY] 表示“X 或 Y”,{X} 表示“除 X 以外的任何氨基酸”。例如,N-糖基化基序 写为 N{P}[ST]{P}。
我们可以通过访问ID查看特定蛋白质的完整描述和特征 UniProt 数据库中的“uniprot_id”,方法是将 ID 号插入
http://www.uniprot.org/uniprot/uniprot_id 或者,可以通过以下方式获得FASTA 格式的蛋白质序列
http://www.uniprot.org/uniprot/uniprot_id.fasta 例如,蛋白质B5ZC00的数据可以在 http://www.uniprot.org/uniprot/B5ZC00 找到。
给出最多 15 个 UniProt 蛋白质数据库访问 ID。
返回对于具有N-糖基化基序的每种蛋白质,输出其给定的访问ID 通过蛋白质串中可以找到基序的位置列表。
例子:
input:
A2Z669 B5ZC00 P07204_TRBM_HUMAN P20840_SAG1_YEAST
output:
B5ZC00 85 118 142 306 395 P07204_TRBM_HUMAN 47 115 116 382 409 P20840_SAG1_YEAST 79 109 135 248 306 348 364 402 485 501 614
代码:
import re
import requests
proteins = []
with open('文件所在目录') as fp:
for lines in fp:
proteins.append(lines.replace('\n',''))
"""
proteins = ['A2Z669','B5ZC00','P07204_TRBM_HUMAN','P20840_SAG1_YEAST']
"""
for i in proteins:
res = []
res.append(i)
if '_' in i:
i = i.split('_')[0] #保留蛋白质编号
seq = ''
url = 'http://www.uniprot.org/uniprot/' + i + '.fasta'
response = requests.get(url=url).text #爬虫爬取网页
index_pos = response.find('\nM') #找到蛋白质序列开始位置
seq+=response[index_pos:].replace('\n','') #组合成完整的蛋白质序列
find = re.compile(r'N(?=[^P][ST][^P])')
f = re.finditer(find,seq)
for _ in f:
res.append(str(_.span()[1]))
if len(res)>1:
print(res[0])
print(' '.join(res[1:]))