Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用零宽度断言查找匹配位置_Python_Regex_Bioinformatics - Fatal编程技术网

Python 使用零宽度断言查找匹配位置

Python 使用零宽度断言查找匹配位置,python,regex,bioinformatics,Python,Regex,Bioinformatics,我试图写一个脚本,找到一个DNA序列的开放阅读框架。但是,我需要确保正则表达式可以找到重叠区域,因此使用了前瞻断言。问题是,当我试图显示匹配的位置时,python没有返回预期的值。我怀疑这是因为?=是零宽度断言。我应该如何解决这个问题?您的模式与ATG之前的零长度字符串匹配。然后,您应该捕获单个组,但该组对您的匹配没有贡献,因此您可能会为您的匹配获得-1。开始和匹配。结束。看 finditer()专门用于非重叠匹配,因此您必须决定使用finditer()还是使用start()和end()。看 我

我试图写一个脚本,找到一个DNA序列的开放阅读框架。但是,我需要确保正则表达式可以找到重叠区域,因此使用了前瞻断言。问题是,当我试图显示匹配的位置时,python没有返回预期的值。我怀疑这是因为?=是零宽度断言。我应该如何解决这个问题?

您的模式与
ATG
之前的零长度字符串匹配。然后,您应该捕获单个组,但该组对您的匹配没有贡献,因此您可能会为您的
匹配获得
-1
。开始
匹配。结束
。看

finditer()专门用于非重叠匹配,因此您必须决定使用finditer()还是使用start()和end()。看


我不知道如何推荐一个优雅的finditer()替代品。

以优秀的团队为例

我希望我猜对了你想要什么

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

我这样写输出是为了直接在连续的行上交错打印。如果您想要输出,没有什么比在代码的正确位置添加一些
1
字符更简单的了,不是吗?有没有办法确保这只返回最长的序列?e、 ATGAGAATAA应该只返回整个序列,而不应该返回ATGAATAA。你说的“最长序列”是指前面有尽可能多的ATG重复的序列吗?也就是说,一种新的情况。我的意思是说,ATG是一个“起始”密码子,只有当它先出现时。如果在同一阅读框中,前面有另一个ATG,它只是另一个氨基酸,不应该被认为是一个新的阅读框。我不明白你的答案。如果是这样的话,我会理解:
我的意思是说,只有当ATG是第一个密码子时,它才是一个“开始”密码子。如果在同一阅读框中有另一个ATG
在它之后,它只是另一个氨基酸