Python,通过正则表达式查找(n)n字符串的长度

时间:2013-09-09 15:50:54

标签: python regex

我的代码看起来像这样:

import HTSeq
reference = open('genome.fa','r')
sequences = dict( (s.name, s) for s in HTSeq.FastaReader(reference))
out = open('homopolymers_in_ref','w')

def find_all(a_str,sub):
    start = 0
    while True:
        start = a_str.find(sub, start)
        if start == -1: return
        yield start
        start += len(sub)
homa = 'AAAAAAAAAA'
homc = 'CCCCCCCCCC'
homg = 'GGGGGGGGGG'
homt = 'TTTTTTTTTT'
for key,line in sequences.items():
    seq = str(line)
    a= list(find_all(seq,homa))
    c = list(find_all(seq,homc))
    g = list(find_all(seq,homg))
    t = list(find_all(seq,homt))
    for i in a:
##        print i,key,'A'
        out.write(str(i)+'\t'+str(key)+'\t'+'A'+'\n')
    for i in c:
        out.write(str(i)+'\t'+str(key)+'\t'+'C'+'\n')
##        print i,key,'C'
    for i in g:
        out.write(str(i)+'\t'+str(key)+'\t'+'G'+'\n')
    for i in t:
        out.write(str(i)+'\t'+str(key)+'\t'+'T'+'\n')
out.close()

我用HTSeq打开参考。它做什么 - 它寻找长度为10的简单均聚物并输出起始位置,染色体和类型(A,C,T,G)。

序列总是如下: ACCGCTACGATCGATCGAAAAAAAAAAAAAAAAAACGATCGAC 有时它包含N

所以我们正在寻找的均聚物是: AAAAAAAAAA(或其他仅由C,G,T组成)

基本上,您的帮助仅限于find_all函数: 现在我想改变的是找到每个均聚物的长度。因为,如果均聚物的长度为15,我的脚本就无法说出来。 我正在考虑通过某种正则表达方式来实现它,即:像现在一样找到至少10 bp并通过向其添加+1来计算长度,直到下一个碱基不像均聚物中的那个。

有关如何使用正则表达式在python中执行此操作的任何建议吗?

1 个答案:

答案 0 :(得分:5)

如果您想使用正则表达式执行此操作,可以尝试以下操作:

>>> import re
>>> seq = 'ACCGCTACGATCGATCGAAAAAAAAAAAAAAAAAACGATCGAC'
>>>
>>> [(m.group(), m.start())
...     for m in re.finditer(r'([ACGT])\1{9,}', seq)
...         if len(m.group()) >= 10]
[('AAAAAAAAAAAAAAAAAA', 17)]

这会生成一个(sequence, start_index)元组列表。