【ROSALIND】【練Python,學(xué)生信】16 尋找蛋白模序

如果第一次閱讀本系列文檔請(qǐng)先移步閱讀【ROSALIND】【練Python,學(xué)生信】00 寫在前面 ?謝謝配合~

題目:
尋找蛋白模序(Finding a Protein Motif)
Given: At most 15 UniProt Protein Database access IDs.
所給:最多15個(gè)UniProt ID。
Return: For each protein possessing the N-glycosylation motif, output its given access ID followed by a list of locations in the protein string where the motif can be found.
需得:對(duì)每個(gè)有N-糖基化模序的蛋白,輸出ID號(hào),其后輸出模序在蛋白序列中的位置。
?
測(cè)試數(shù)據(jù)
A2Z669
B5ZC00
P07204_TRBM_HUMAN
P20840_SAG1_YEAST
測(cè)試輸出
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
?
背景
蛋白基序的表示方法:[XY]意為X或Y,{X}意為除了X以外任意一種氨基酸。
N-糖基化基序可表示為N{P}[ST]{P}。
UniProt是Universal Protein的英文縮寫,是信息最豐富、資源最廣的蛋白質(zhì)數(shù)據(jù)庫(kù)。它由整合Swiss-Prot、 TrEMBL 和 PIR-PSD 三大數(shù)據(jù)庫(kù)的數(shù)據(jù)而成。數(shù)據(jù)主要來(lái)自于基因組測(cè)序項(xiàng)目完成后,后續(xù)獲得的蛋白質(zhì)序列,還包含了大量來(lái)自文獻(xiàn)的蛋白質(zhì)的生物功能的信息。
從UniProt數(shù)據(jù)庫(kù)獲取某個(gè)蛋白質(zhì)信息的網(wǎng)址為http://www.uniprot.org/uniprot/uniprot_id
獲取FASTA格式的某個(gè)蛋白序列可通過(guò)網(wǎng)址http://www.uniprot.org/uniprot/uniprot_id.fasta
?
思路
(本題不會(huì)做,代碼全部來(lái)自網(wǎng)絡(luò)╮(﹀_﹀)╭)
可以把該題目拆解成三個(gè)問題逐個(gè)理解。
第一,獲取蛋白fasta格式的序列。利用背景給出的方法我們可以通過(guò)UniProt ID得到每個(gè)蛋白的序列網(wǎng)址,比如對(duì)B5ZC00,網(wǎng)址為https://www.uniprot.org/uniprot/B5ZC00.fasta ,隨后利用urllib.request包中提供的方法,可以提取到網(wǎng)頁(yè)信息。我們直接打開網(wǎng)頁(yè)可以看到如下信息:

? ?
與我們熟悉的fasta格式文件一樣,第一行是描述,換行(\n)后是序列以M開頭。因此我們遇到的第一個(gè)’\nM’肯定是序列開始部分,找到這個(gè)索引,加上2即為序列開頭M的索引,其后所有內(nèi)容都是蛋白序列,將格式稍事調(diào)整即得到完整序列。
第二,用正則表達(dá)式表示模序。題目和背景給出了N-糖基化蛋白模序,因此只需要掌握正則表達(dá)式即可(可惜我還未掌握)。
第三,在蛋白序列中匹配模序,有則輸出位置。用字符串帶的搜索方法即可。
?
?
Python知識(shí)點(diǎn)
正則表達(dá)式(Regular Expression,在代碼中常簡(jiǎn)寫為regex、regexp或RE)是計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式通常被用來(lái)檢索、替換那些符合某個(gè)模式(規(guī)則)的文本。即用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來(lái)表達(dá)對(duì)字符串的一種過(guò)濾邏輯。
網(wǎng)絡(luò)爬蟲是一種按照一定的規(guī)則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或者腳本。
?
代碼
import urllib.request
import re
f = open('rosalind_mprt.txt', 'r')
names = f.readlines()
f.close()
i = 0
while i < len(names):
??? name = str(names[i]).strip()
??? url = 'http://www.uniprot.org/uniprot/' + name + '.fasta'
??? req = urllib.request.Request(url)
??? response = urllib.request.urlopen(req)
??? the_page = response.read()
??? start = the_page.find('\nM'.encode())
??? the_page = str(the_page)
??? seq = the_page[start + 2:].replace('\\n', '').replace('\'', '')
??? seq = ' ' + seq
??? regex = re.compile(r'N(?=[^P][ST][^P])')
??? out = []
??? index = 0
??? while index < len(seq):
??????? index += 1
?
??????? if? re.search(regex, seq[index:]) == None:
??????????? break
??????? if re.match(regex, seq[index:]) != None:
??????????? out.append(index)
?
??? if out != []:
??????? print(name)
??????? print(' '.join([str(i) for i in out]))
??? i += 1