寻找蛋白质序列中的氨基酸基序

1 投票
3 回答
2314 浏览
提问于 2025-04-18 01:00

我有一个简单的搜索引擎,里面有一个字典,包含了多个条目的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 个回答

0

谢谢你的建议!

可惜的是,所有使用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

非常感谢你的帮助!

0

你可以对子序列进行重复的研究:

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)),那么你就需要更精确的研究方法。

1

如果你想找到所有出现的地方,只需要用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

撰写回答