寻找蛋白质序列中的氨基酸基序
我有一个简单的搜索引擎,里面有一个字典,包含了多个条目的UniProt代码和序列。
最终,我想在这些序列中找到一些特征,并打印出每个序列中这些特征的起始氨基酸位置。
对于简单的特征,我已经用下面的代码完成了这个任务。
#Simple definition of the motif
motif='AA'
for u, seq in dict.iteritems():
for i in range(len(seq)):
if seq[i:].startswith(motif):
print "%s has been found in %d position of %s"%(motif, i+1, u)
continue
我的字典大概是这样的:
>>> dict
{'P07204_TRBM_HUMAN': 'MLGVLVLGALALAGLGFPAPAEPQPGGSQCVEHDCFALYPGPATFLNASQICDGLRGHLMTVRSSVAADVISLLLNGDGGVGRRRLWIGLQLPPGCGDPKRLGPLRGFQWVTGDNNTSYSRWARLDLNGAPLCGPLCVAVSAAEATVPSEPIWEEQQCEVKADGFLCEFHFPATCRPLAVEPGAAAAAVSITYGTPFAARGADFQALPVGSSAAVAPLGLQLMCTAPPGAVQGHWAREAPGAWDCSVENGGCEHACNAIPGAPRCQCPAGAALQADGRSCTASATQSCNDLCEHFCVPNPDQPGSYSCMCETGYRLAADQHRCEDVDDCILEPSPCPQRCVNTQGGFECHCYPNYDLVDGECVEPVDPCFRANCEYQCQPLNQTSYLCVCAEGFAPIPHEPHRCQMFCNQTACPADCDPNTQASCECPEGYILDDGFICTDIDECENGGFCSGVCHNLPGTFECICGPDSALARHIGTDCDSGKVDGGDSGSGEPPPSPTPGSTLTPPAVGLVHSGLLIGISIASLCLVVALLALLCHLRKKQGAARAKMEYKCAAPSKEVVLQHVRTERTPQRL', 'B5ZC00': 'MKNKFKTQEELVNHLKTVGFVFANSEIYNGLANAWDYGPLGVLLKNNLKNLWWKEFVTKQKDVVGLDSAIILNPLVWKASGHLDNFSDPLIDCKNCKARYRADKLIESFDENIHIAENSSNEEFAKVLNDYEISCPTCKQFNWTEIRHFNLMFKTYQGVIEDAKNVVYLRPETAQGIFVNFKNVQRSMRLHLPFGIAQIGKSFRNEITPGNFIFRTREFEQMEIEFFLKEESAYDIFDKYLNQIENWLVSACGLSLNNLRKHEHPKEELSHYSKKTIDFEYNFLHGFSELYGIAYRTNYDLSVHMNLSKKDLTYFDEQTKEKYVPHVIEPSVGVERLLYAILTEATFIEKLENDDERILMDLKYDLAPYKIAVMPLVNKLKDKAEEIYGKILDLNISATFDNSGSIGKRYRRQDAIGTIYCLTIDFDSLDDQQDPSFTIRERNSMAQKRIKLSELPLYLNQKAHEDFQRQCQK', 'A2Z669': 'MRASRPVVHPVEAPPPAALAVAAAAVAVEAGVGAGGGAAAHGGENAQPRGVRMKDPPGAPGTPGGLGLRLVQAFFAAAALAVMASTDDFPSVSAFCYLVAAAILQCLWSLSLAVVDIYALLVKRSLRNPQAVCIFTIGDGITGTLTLGAACASAGITVLIGNDLNICANNHCASFETATAMAFISWFALAPSCVLNFWSMASR', 'P20840_SAG1_YEAST': 'MFTFLKIILWLFSLALASAININDITFSNLEITPLTANKQPDQGWTATFDFSIADASSIREGDEFTLSMPHVYRIKLLNSSQTATISLADGTEAFKCYVSQQAAYLYENTTFTCTAQNDLSSYNTIDGSITFSLNFSDGGSSYEYELENAKFFKSGPMLVKLGNQMSDVVNFDPAAFTENVFHSGRSTGYGSFESYHLGMYCPNGYFLGGTEKIDYDSSNNNVDLDCSSVQVYSSNDFNDWWFPQSYNDTNADVTCFGSNLWITLDEKLYDGEMLWVNALQSLPANVNTIDHALEFQYTCLDTIANTTYATQFSTTREFIVYQGRNLGTASAKSSFISTTTTDLTSINTSAYSTGSISTVETGNRTTSEVISHVVTTSTKLSPTATTSLTIAQTSIYSTDSNITVGTDIHTTSEVISDVETISRETASTVVAAPTSTTGWTGAMNTYISQFTSSSFATINSTPIISSSAVFETSDASIVNVHTENITNTAAVPSEEPTFVNATRNSLNSFCSSKQPSSPSSYTSSPLVSSLSVSKTLLSTSFTPSVPTSNTYIKTKNTGYFEHTALTTSSVGLNSFSETAVSSQGTKIDTFLVSSLIAYPSSASGSQLSGIQQNFTSTSLMISTYEGKASIFFSAELGSIIFLLLSYLLF'}
这段代码会打印出所有氨基酸特征在三个序列中的位置。
现在,我想用正则表达式(RE)在这些序列中找到更复杂的特征。
# search complex motifs using regular expressions
for u, seq in dict.iteritems():
m=re.search(r"N[^P](S|T)[^P]", seq[:])
if re.search(r"N[^P](S|T)[^P]", seq[:]):
print "%s has been found at the %s position in %s"%(m.group(), str(m.start()+1), u)
continue
使用这段代码,我只能在序列中检测到特征一次。为了更准确地获得结果,就像第一次那样,我应该如何定义一个额外的循环,以便假设每个特征在每个序列中可能出现多次?
3 个回答
谢谢你的建议!
可惜的是,所有使用WHILE循环的例子都产生了无限循环,结果也不对。
我已经通过使用re.match方法和我最初的算法解决了这个问题。请问我该如何提高这种循环的效率呢?
for u, seq in dict.iteritems():
for i in range(len(seq)):
if re.match(motif, seq[i:]):
print "%s has been found in %d position of %s"%(motif, i+1, u)
found[u]=i+1
continue
另外,我在这个循环中定义的字典也有问题,它应该把找到的值(每个Uniprot代码(键)对应的找到的模式的位置)添加进去。下面你可以看到,循环结束后,每个键只添加了最后一个位置,尽管在多个位置找到了模式。
{'P07204_TRBM_HUMAN': 409, 'B5ZC00': 395, 'P20840_SAG1_YEAST': 614}
还有,如何将motif=re.compile(r"N^P[^P]")以明确的形式表示呢?下面你可以看到结果中的一些错误,应该在第一位定义模式。
<_sre.SRE_Pattern object at 0x7f4ee5b11b70> has been found in 364 position of P20840_SAG1_YEAST
<_sre.SRE_Pattern object at 0x7f4ee5b11b70> has been found in 402 position of P20840_SAG1_YEAST
<_sre.SRE_Pattern object at 0x7f4ee5b11b70> has been found in 485 position of P20840_SAG1_YEAST
<_sre.SRE_Pattern object at 0x7f4ee5b11b70> has been found in 501 position of P20840_SAG1_YEAST
<_sre.SRE_Pattern object at 0x7f4ee5b11b70> has been found in 614 position of P20840_SAG1_YEAST
非常感谢你的帮助!
你可以对子序列进行重复的研究:
for u, seq in dict.iteritems():
start = 0;
m=re.search(r"N[^P](S|T)[^P]", seq[start:])
while (m) :
print "%s has been found at the %s position in %s"%(m.group(), str(m.start()+1), u)
start = m.start()
m=re.search(r"N[^P](S|T)[^P]", seq[start:])
如果你的模式与自身重叠(比如说你在AEAEA中寻找AEA,你只会找到(AEA)EA,而找不到AE(AEA)),那么你就需要更精确的研究方法。
如果你想找到所有出现的地方,只需要用findall
,而不是用search
。这样会返回一个结果列表,而不是只给你一个结果。
另外,你现在的搜索方式其实有点慢。你用多次切割字符串(seq[i:]
)然后在每一部分上用startswith
,这样效率不高。可以考虑在整个字符串上多次使用string.index
,这样会更快:
motif='AA'
for u, seq in dict.iteritems():
i=-1 #start search at the beginning of the sequence
while True:
try:
i= seq.index(motif, i+1) #get the index of the next occurrence
print "%s has been found in %d position of %s"%(motif, i+1, u)
except ValueError:
break #no more motifs found