1

我有一个由字典组成的简单搜索引擎,其中包含多个条目的 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'}

这将打印所有三个序列上的所有 AA 基序位置。

现在我想使用 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

使用此代码,我只能在序列中检测一次主题。假设每个基序在每个序列中可以多次出现,我应该如何定义加法 FOR 循环以获得更准确的结果,就像在第一种情况下一样?

4

3 回答 3

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
于 2014-04-02T12:01:41.330 回答
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)),这将不起作用,在这种情况下,您需要进行更精确的研究。

于 2014-04-02T11:45:29.243 回答
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

非常感谢您的帮助

于 2014-04-02T19:21:44.700 回答