我正在尝试编写一个脚本来找到 DNA 序列的开放阅读框。但是,我需要确保正则表达式可以找到重叠区域,因此使用了前瞻断言。问题是当我试图显示匹配的位置时,python 没有返回预期值。我怀疑这是因为 ?= 是一个零宽度断言。我应该如何解决这个问题?
user1647556
问问题
95 次
2 回答
0
您的模式在ATG
. 然后,您应该捕获一个组,但该组对您的匹配没有贡献,因此您可能会-1
为您的match.start
and获得一个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() 替代品。
于 2013-09-04T15:40:53.320 回答
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
于 2013-09-04T18:38:20.903 回答