Как получить перекрывающиеся шаблоны с помощью Python Finditer?

Я использую скрипт Python, который ищет шаблон в файле FASTA. Он работает очень хорошо, но не возвращает перекрывающихся строк. К сожалению, меня интересуют потенциальные перекрывающиеся строки. Поскольку я не программист (я просто пытаюсь изучать Python), мне было интересно, может ли кто-нибудь изменить скрипт, чтобы найти перекрывающиеся строки. Я думаю, что модуль regex мог это сделать, но я попытался установить его на свой компьютер (Windows) безуспешно. Я получил это:

C:\Python33>regex-2014.02.19>python setup.py install
running install
running build
running build_py
runnning built_ext
building'_regex' extension
error:Unable to find vcvarsall.bat

Для меня было бы легче работать с измененным сценарием. Итак, вот мой сценарий:

import re
import sys

psq_re_f= re.compile('G{3,}.{1,7}?G{3,}.{1,7}?G{3,}.{1,7}?G{3,}') #((?<=G)[^G]|(?<!G).)
psq_re_r= re.compile('C{3,}.{1,7}?C{3,}.{1,7}?C{3,}.{1,7}?C{3,}') #((?<=C)[^C]|(?<!C).)


filename = input('Enter the name of the input fasta file: ')
ref_seq_fh = open(filename)

outputfileg = open("strelkaindels_quadg.txt",'wt')
outputfilec = open("strelkaindels_quadc.txt",'wt')

outputfileg.write('#\tID\tEntry Length\tStart\tEnd\tLength\tStrand\tSequence\n')
outputfilec.write('#\tID\tEntry Length\tStart\tEnd\tLength\tStrand\tSequence\n')

count = 0
ref_seq = []
line = (ref_seq_fh.readline()).strip()
chr = re.sub('^>', '', line)
chr1 = chr.split (":")
#line = (ref_seq_fh.readline()).strip()
while True:
    while line.startswith('>') is False:
        ref_seq.append(line)
        line = (ref_seq_fh.readline()).strip()
        if line == '':
            break
    ref_seq = ''.join(ref_seq)
    for m in re.finditer(psq_re_f, ref_seq):
        count=count+1
        outputfileg.write('%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s' %(count, chr1[0], len(ref_seq), m.start(), m.end(), len(m.group(0)), '+', m.group(0))+'\n')
    for m in re.finditer(psq_re_r, ref_seq):
        count=count+1
        outputfilec.write('%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s' %(count, chr1[0], len(ref_seq), m.start(), m.end(), len(m.group(0)), '-', m.group(0))+'\n')
    chr = re.sub('^>', '', line)
    chr1 = chr.split (":")
    ref_seq = []
    line= (ref_seq_fh.readline()).strip()
    if line == '':
        break


outputfileg.close()
outputfilec.close()

Наконец, пример файла fasta (текстовый формат для представления нуклеотидных последовательностей), широко используемый в биологии:

>id_1
agatagatgatagatatagagagcgcgctagatcgatcgatcgagtcgatcgcgcggggggcccctctctctctatagggacatacga
>id_2
agacatcagatacagagatatttacataacaagagatacag
>id_3
cgctctagctcctcctctcgcgtagctagctctctctaacatgattagaattcagatcgatcgatcgatggttttttttctctct
and so on...

Например, давайте представим следующую последовательность:

GGGTGGGTGGGCGGGAGGG

Скрипт вернет только эту строку:

GGGTGGGTGGGCGGG

Но я бы тоже хотел получить это:

GGGTGGGCGGGAGGG

1 ответ

Решение

Вы можете попробовать использовать положительный тупик:

(?=(G{3,}.{1,7}?G{3,}.{1,7}?G{3,}.{1,7}?G{3,}))

regex101 demo

И в вашем коде вам придется изменить ваши группы на .group(1) но m.end() будет так же, как m.start(), так что вы можете обойти это немного, может быть, я использую len():

for m in re.finditer(psq_re_f, ref_seq):
    count=count+1
    outputfileg.write('%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s' % (count,
                      chr1[0], len(ref_seq), m.start(),
                      m.start() + len(m.group(1)), len(m.group(1)),
                      '+',m.group(1))+'\n')
Другие вопросы по тегам