繁体   English   中英

使用python进行字符串模式匹配

[英]string pattern matching using python

我正在研究python和bio序列。
我有一个序列。

seq1 = \
...        """ atgaaatttatcattgaacgtgagcatctgctaaaaccactgcaacaggtcagtagcccg
...        ctgggtggacgccctacgttgcctattttgggtaacttgttgctgcaagtcacggaaggc
...        tctttgcggctgaccggtaccgacttggagatggagatggtggcttgtgttgccttgtct
...        cagtcccatgagccgggtgctaccacagtacccgcacggaagttttttgatatctggcgt
...        ggtttacccgaaggggcggaaattacggtagcgttggatggtgatcgcctgctagtgcgc
...        tctggtcgcagccgtttctcgctgtctaccttgcctgcgattgacttccctaatctggat
...        gactggcagagtgaggttgaattcactttaccgcaggctacgttaaagcgtctgattgag
...        tccactcagttttcgatggcccatcaggatgtccgttattatttgaacggcatgctgttt
...        gagaccgaaggcgaagagttacgtactgtggcgaccgatgggcatcgcttggctgtatgc
...        tcaatgcctattggccagacgttaccctcacattcggtgatcgtgccgcgtaaaggtgtg
...        atggagctggttcggttgctggatggtggtgatacccccttgcggctgcaaattggcagt
...        aataatattcgtgctcatgtgggcgattttattttcacatctaagctggttgatggccgt
...        ttcccggattatcgccgcgtattgccgaagaatcctgataaaatgctggaagccggttgc
...        gatttactgaaacaggcattttcgcgtgcggcaattctgtcaaatgagaagttccgtggt
...        gttcggctctatgtcagccacaatcaactcaaaatcactgctaataatcctgaacaggaa
...        gaagcagaagagatcctcgatgttagctacgaggggacagaaatggagatcggtttcaac
...        gtcagctatgtgcttgatgtgctaaatgcactgaagtgcgaagatgtgcgcctgttattg
...        actgactctgtatccagtgtgcagattgaagacagcgccagccaagctgcagcctatgtc
...        gtcatgccaatgcgtttgtag"""

seq2 = \
...        """ accgtagcatctgctaaaaccagtacgcccg
...        ctgggtggacgatgcaacttgttgctgcaagtcacggaaggc
...        tctttgcggctgaccggtaccgacttggagatggagatggtggcttgtgttgccttgtct
...        cagtcccatgagccgggtgctaccacagtacccgcacggaagttttttgatatctggcgt
...        ggtttacccgaaggggcggaaattacggtagcgttggatggtgcatgatcgcctgctagtgcgc
...        tctggtcgcagccgtttctcgctgtctaccttgcctgcgattgacttccctaatctggat
...        gactggcagagtgaggttgaattcactttaccgcaggctacgttaaagcgtctgattgag
...        tccactcagttttcgatgctatttatgtccgttattatttgaacggcatgctgttt
...        gagaccgaaggcgaagagttacgtactgtggcgaccgatgggcatcgcttggctgtatgc
...        tcaatgcctattggccaggctaattcggtgatcgtgccgcgtaaaggtgtg
...        atggagctggttcggttgctggatggtggtgatacccccggcccctgcaaattggcagt
...        aataatattcgtgctcatgtgggcgattttattttcacatctaagctggttgatggccgt
...        ttcccggattatcgccgcgtattgccgaagaatcctgataaaatgctggaagccggttgc
...        gtcatgccaatgcgtttgtag"""

我想找出seq1和seq2中有多少个相同的字符串以及它们各自的位置。 这不仅是模式匹配,而且还可以获得位置。 谁能告诉我如何使用python做同样的事情?

索引器功能将所有位置作为列表返回

def indexer(s, sub):
    positions=[]
    pos=0
    while True:
        pos=s.find(sub,pos+1)
        if pos==-1:
            return positions
        else:
            positions.append(pos)

匹配器函数将返回一个字典。 dict中的每个键都是在a和b中都可用的序列,相应的dict值是2个项目元组,其中包含a的所有匹配位置和b的所有匹配位置:

def matcher(a,b):
    sequences=set()
    for l in range(1,len(a)):
        for pos in range(len(a)):
            sequences.add(a[pos:pos+l])
    for l in range(1,len(b)):
        for pos in range(len(b)):
            sequences.add(b[pos:pos+l]) 
    matches={}
    for seq in sequences:
        matches_a=indexer(a,seq)
        matches_b=indexer(b,seq)
        if result_a and result_b:
            matches[seq]=(matches_a,matches_b)
    return matches

这个例子应该工作:

print matcher('asdfasdfa','asdfasasdfasdfasdfadfasdfdf') 

您可以只使用index

>>> seq.index(str)
1046

请注意,它将找到您第一次出现的位置。 然后,您可以尝试从切片中查找其他事件。

已编辑

当发生多次事件时,这样的循环可能会起作用:

test = seq1 + ""
try:
    while test:
        position = test.index(str_)
        positions.append(position + last_position)
        position += len(str_)
        last_position += position
        test = test[position:]
except ValueError:
    print positions

我们将复制seq字符串,因为我们将使用它。 然后,我们继续使用index方法检查位置,将其存储在positions并相应地更新字符串。

[PS]调用变量str想法不好,您正在覆盖内置str ...

也许Wikibooks可以帮助您入门?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM