在文本中搜索的模式

时间:2012-01-29 16:56:39

标签: python

我的文本文件如下:seq.txt

>S1
AACAAGAAGAAAGCCCGCCCGGAAGCAGCTCAATCAGGAGGCTGGGCTGGAATGACAGCG
CAGCGGGGCCTGAAACTATTTATATCCCAAAGCTCCTCTCAGATAAACACAAATGACTGC
GTTCTGCCTGCACTCGGGCTATTGCGAGGACAGAGAGCTGGTGCTCCATTGGCGTGAAGT
CTCCAGGGCCAGAAGGGGCCTTTGTCGCTTCCTCACAAGGCACAAGTTCCCCTTCTGCTT
CCCCGAGAAAGGTTTGGTAGGGGTGGTGGTTTAGTGCCTATAGAACAAGGCATTTCGCTT
CCTAGACGGTGAAATGAAAGGGAAAAAAAGGACACCTAATCTCCTACAAATGGTCTTTAG
TAAAGGAACCGTGTCTAAGCGCTAAGAACTGCGCAAAGTATAAATTATCAGCCGGAACGA
GCAAACAGACGGAGTTTTAAAAGATAAATACGCATTTTTTTCCGCCGTAGCTCCCAGGCC
AGCATTCCTGTGGGAAGCAAGTGGAAACCCTATAGCGCTCTCGCAGTTAGGAAGGAGGGG
TGGGGCTGTCCCTGGATTTCTTCTCGGTCTCTGCAGAGACAATCCAGAGGGAGACAGTGG
ATTCACTGCCCCCAATGCTTCTAAAACGGGGAGACAAAACAAAAAAAAACAAACTTCGGG
TTACCATCGGGGAACAGGACCGACGCCCAGGGCCACCAGCCCAGATCAAACAGCCCGCGT
CTCGGCGCTGCGGCTCAGCCCGACACACTCCCGCGCAAGCGCAGCCGCCCCCCCGCCCCG
GGGGCCCGCTGACTACCCCACACAGCCTCCGCCGCGCCCTCGGCGGGCTCAGGTGGCTGC
GACGCGCTCCGGCCCAGGTGGCGGCCGGCCGCCCAGCCTCCCCGCCTGCTGGCGGGAGAA
ACCATCTCCTCTGGCGGGGGTAGGGGCGGAGCTGGCGTCCGCCCACACCGGAAGAGGAAG
TCTAAGCGCCGGAAGTGGTGGGCATTCTGGGTAACGAGCTATTTACTTCCTGCGGGTGCA
CAGGCTGTGGTCGTCTATCTCCCTGTTGTTC

>S2
ACACGCATTCACTAAACATATTTACTATGTGCCAGGCACTGTTCTCAGTGCTGGGGATAT
AGCAGTGAAGAAACAGAAACCCTTGCACTCACTGAGCTCATATCTTAGGGTGAGAAACAG
TTATTAAGCAAGATCAGGATGGAAAACAGATGGTACGGTAGTGTGAAATGCTAAAGAGAA
AAATAACTACGGAAAAGGGATAGGAAGTGTGTGTATCGCAGTTGACTTATTTGTTCGCGT
TGTTTACCTGCGTTCTGTCTGCATCTCCCACTAAACTGTAAGCTCTACATCTCCCATCTG
TCTTATTTACCAATGCCAACCGGGGCTCAGCGCAGCGCCTGACACACAGCAGGCAGCTGA
CAGACAGGTGTTGAGCAAGGAGCAAAGGCGCATCTTCATTGCTCTGTCCTTGCTTCTAGG
AGGCGAATTGGGAAATCCAGAGGGAAAGGAAAAGCGAGGAAAGTGGCTCGCTTTTGGCGC
TGGGGAAGAGGTGTACAGTGAGCAGTCACGCTCAGAGCTGGCTTGGGGGACACTCTCACG
CTCAGGAGAGGGACAGAGCGACAGAGGCGCTCGCAGCAGCGCGCTGTACAGGTGCAACAG
CTTAGGCATTTCTATCCCTATTTTTACAGCGAGGGACACTGGGCCTCAGAAAGGGAAGTG
CCTTCCCAAGCTCCAACTGCTCATAAGCAGTCAACCTTGTCTAAGTCCAGGTCTGAAGTC
CTGGAGCGATTCTCCACCCACCACGACCACTCACCTACTCGCCTGCGCTTCACCTCACGT
GAGGATTTTCCAGGTTCCTCCCAGTCTCTGGGTAGGCGGGGAGCGCTTAGCAGGTATCAC
CTATAAGAAAATGAGAATGGGTTGGGGGCCGGTGCAAGACAAGAATATCCTGACTGTGAT
TGGTTGAATTGGCTGCCATTCCCAAAACGAGCTTTGGCGCCCGGTCTCATTCGTTCCCAG
CAGGCCCTGCGCGCGGCAACATGGCGGGGTCCAGGTGGAGGTCTTGAGGCTATCAGATCG
GTATGGCATTGGCGTCCGGGCCCGCAAGGCG

.
.
.
.

我必须计算这些序列中的模式以实现python脚本

import re

infile = open("seq.txt", 'r')

out = open("pat.txt", 'w')

pattern = re.compile("GAAAT", flags=re.IGNORECASE)


for line in infile:
   line = line.strip("\n")
   if line.startswith('>'):
      name = line
   else:
      s = re.findall(pattern,line)

      print '%s:%s' %(name,s)
      out.write('%s:\t%s\n' %(name,len(s)))

但它给出了错误的结果。脚本逐行阅读。

S1 : 0
S1 : 0
S1 : 0
S1 : 0
S2 : 0
S2 : 1
S2 : 0   
S2 : 1

但我想要输出如下:

S1 : 0    
S2 : 2

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

使用点击计数器,如果line.startswith('>')为零。否则增加len(s)

答案 1 :(得分:1)

此代码可能对您有所帮助:

import re

pattern = re.compile("GAAAT", flags=re.IGNORECASE)

with open('seq.txt') as f:
    sections = f.read().split('\n\n')

    for section in sections:
        lines = section.split()
        name = lines[0].lstrip('>')
        data = ''.join(lines[1:])
        print '{0}: {1}'.format(name, len(pattern.findall(data)))

示例输出:

S1: 1
S2: 2

注意:

  • 假设在示例中使用了两个换行符来分隔每个部分。
  • 假设每个部分名称前面都有一个大于(>)的字符,如示例所示。
  • 如果您已有模式,请使用pattern.findall(data)代替re.findall(pattern, data)

答案 2 :(得分:0)

您应该收集输入,直到您输入下一个模式。这也可以解决你的模式穿过线边界的角落情况(不确定你的数据是否“可以”发生,但它看起来像是这样)。

答案 3 :(得分:0)

使用计数器。另外,在print循环中放置for函数,因此它将迭代else条件的次数。请注意,使用变量line作为for循环中的迭代器变量和作为另一个变量也不是一个好主意。它使代码更加混乱。

counter_dict = {}
for line in infile:
    if line[0] == '>':
        name = line[1:len(line) - 2]
        counter_dict[name] = 0
    else:
        counter_dict[name] += len(re.findall(pattern,line))

for (key, val) in counter_dict.items():
    print '%s:%s' %(key, val)
    out.write('%s:\t%s\n' %(key, val)