2013-09-04 3 views
0

Я пытаюсь написать сценарий, который найдет открытую рамку считывания последовательности ДНК. Тем не менее, мне нужно убедиться, что регулярное выражение может найти перекрывающиеся области и, таким образом, использовать утверждение lookahead. Проблема в том, что когда я пытаюсь показать позицию совпадения, python не возвращает ожидаемые значения. Я подозреваю, что это потому, что? = Это утверждение с нулевой шириной. Как мне обойти это?Поиск позиции соответствия с утверждениями с нулевой шириной

ответ

0

Ваш шаблон соответствует строке нулевой длины непосредственно перед ATG. Затем вы должны захватить одну группу, но группу, которая не способствует вашей встрече, поэтому вы, вероятно, получите -1 для своих match.start и match.end. См. http://docs.python.org/2/library/re.html#re.MatchObject.end

finditer() предназначен специально для совпадений с совпадением, поэтому вам придется выбирать между использованием finditer() и start() и end(). См. http://docs.python.org/2/library/re.html#re.finditer

Я не знаю достаточно, чтобы рекомендовать элегантную замену finditer().

0

Возьмите хорошую группу ....

Я надеюсь, что я угадал, что вы хотите.

import re 

def orfs(sequence, aa): 
    rframe = [] 
    orf_re = ('(?=' 
       '(' 
       'ATG(?:[ATGC]{3}){%d,}?' 
       '(?:TAG|TAA|TGA)' 
       ')' 
       ')' \ 
       % (aa)) 
    for match in re.finditer(orf_re, sequence): 
     print 'groups()',repr(match.groups()),match.span() 
     print 'group(0)',repr(match.group(0)),match.span(0) 
     print 'group(1)',repr(match.group(1)),match.span(1) 
     print 
     rframe.append('span (%d , %d)\n' 
       'stop codon %s\n' 
       'nucleotide length %d\n' 
       'amino acid length %d\n' 
       'reading frame %d\n' 
       % 
       (match.start(1),match.end(1), 
       sequence[match.end(1)-3:match.end(1)], 
       match.end(1) - match.start(1), 
       (match.end(1) - match.start(1) - 3)/3, 
       match.start() % 3)) 

    return rframe 

s = ('AGCTGCTG', 
    'ATG', 
    'GGG' 'GGG' 'GGG' 'GGG' 'GGG' 'GGG', 
    'TA', 
    'A', # overlaping 
    'TG', 
    'CCC' 'CCC' 'CCC' 'CCC' 'CCC', 
    'TAG', 
    'TTTGTCTAG') 

print '\n'.join(s) 
print '===================' 
s = ''.join(s) 
print '\n'.join(orfs(s,3)) 

результат

AGCTGCTG 
ATG 
GGGGGGGGGGGGGGGGGG 
TA 
A 
TG 
CCCCCCCCCCCCCCC 
TAG 
TTTGTCTAG 
=================== 
groups() ('ATGGGGGGGGGGGGGGGGGGGTAA',) (8, 8) 
group(0) '' (8, 8) 
group(1) 'ATGGGGGGGGGGGGGGGGGGGTAA' (8, 32) 

groups() ('ATGCCCCCCCCCCCCCCCTAG',) (31, 31) 
group(0) '' (31, 31) 
group(1) 'ATGCCCCCCCCCCCCCCCTAG' (31, 52) 

span (8 , 32) 
stop codon TAA 
nucleotide length 24 
amino acid length 7 
reading frame 2 

span (31 , 52) 
stop codon TAG 
nucleotide length 21 
amino acid length 6 
reading frame 1 
+0

Я написал вывод, как, что для того, чтобы непосредственно напечатать его в шахматном порядке на последовательных линиях. Если вы хотите получить свой результат, ничего проще, чем добавлять символы '' 1'' в нужные места в коде, не так ли? – eyquem

+0

Есть ли способ убедиться, что это возвращает только самые длинные последовательности? например ATGATGAAATAA должен возвращать только целые последовательности и не должен возвращать ATGAAATAA. –

+0

«Самая длинная последовательность», вы имеете в виду последовательности с максимально возможными повторениями ATG впереди? То есть новое условие. – eyquem

Смежные вопросы