2013-09-04 1 views
0

DNA 시퀀스의 오픈 리딩 프레임을 찾을 스크립트를 작성하려고합니다. 그러나, 나는 정규식이 중복 영역을 찾을 수 있는지 확인해야하므로 lookahead 어설 션을 사용해야합니다. 문제는 경기의 위치를 ​​표시하려고 할 때 Python이 예상 값을 반환하지 않는다는 것입니다. 이것은? =가 너비가 아닌 어설 션이기 때문에 이것이라고 생각됩니다. 이 문제를 어떻게 해결해야합니까?너비가 0 인 어설 션과 일치하는 위치 찾기

답변

0

귀하의 패턴은 ATG 직전에 길이가 0 인 문자열과 일치합니다. 그런 다음 단일 그룹을 포착해야하지만 일치하는 항목에 포함되지 않는 그룹을 캡처해야하므로 match.startmatch.end에 대해 -1이 표시됩니다. 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

관련 문제