Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.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 re.finditer()为start和end方法返回相同的值_Python_Regex_Itertools - Fatal编程技术网

Python re.finditer()为start和end方法返回相同的值

Python re.finditer()为start和end方法返回相同的值,python,regex,itertools,Python,Regex,Itertools,python中的re.finditer()方法有问题。例如: >>>sequence = 'atgaggagccccaagcttactcgatttaacgcccgcagcctcgccaaaccaccaaacacacca' >>>[[m.start(),m.end()] for m in re.finditer(r'(?=gatttaacg)',sequence)] out: [[22,22]] 如您所见,start()和end()方法给出了相同的值。我以前

python中的re.finditer()方法有问题。例如:

>>>sequence = 'atgaggagccccaagcttactcgatttaacgcccgcagcctcgccaaaccaccaaacacacca'
>>>[[m.start(),m.end()] for m in re.finditer(r'(?=gatttaacg)',sequence)]

out: [[22,22]]
如您所见,
start()
end()
方法给出了相同的值。我以前已经注意到了这一点,只是使用了
m.start()+len(query\u sequence)
,而不是
m.end()
,但我很困惑为什么会发生这种情况

sequence = 'atgaggagccccaagcttactcgatttaacgcccgcagcctcgccaaaccaccaaacacacca'
print [[m.start(),m.end()] for m in re.finditer(r'(gatttaacg)',sequence)]
删除
lookahead
。它不仅捕获断言

输出:
[[22,31]]

如果必须使用
lookahead
使用

sequence = 'atgaggagccccaagcttactcgatttaacgcccgcagcctcgccaaaccaccaaacacacca'
print [[m.start(),m.start()+len("aca")] for m in re.finditer(r'(?=aca)',sequence)]

按照规定,您需要查找重叠的匹配项,并需要进行前瞻。但是,您似乎知道要查找的确切字符串。这个怎么样

def find_overlapping(sequence, matchstr):
    for m in re.finditer('(?={})'.format(matchstr)):
        yield (m.start(), m.start() + len(matchstr))
或者,您可以使用第三方Python模块,如前所述。

该模块支持与FindItemer重叠:

import regex
sequence = 'acaca'
print [[m.start(), m.end()] for m in regex.finditer(r'(aca)', sequence, overlapped=1)]
[0, 3], [2, 5]]

如果子序列的长度事先未知,则可以在“向前看”中使用匹配组并获取其:

例如,要查找所有重复字符:

[m.span(1) for m in re.finditer(r'(?=(([acgt])\2+))',sequence)]

为什么要使用前瞻?我使用前瞻是因为我想要重叠的匹配。例如,如果我正在搜索aca,我希望acaca计算为2次而不是1次。好吧,你知道请求序列的长度,那么为什么你甚至需要
m.end()
?好吧,那么删除前瞻是行不通的,只需将长度添加到开始是你唯一的选择前瞻不是匹配的一部分。匹配从位置22开始和结束,即使它是匹配的事实取决于之后的字符。澄清:这意味着当
re.finditer
匹配
gatttaacg
时,实际值不会被消耗。它只会到达那个位置并说“是的,在这个位置前面的是请求的字符串”如果您使用的是lookaheads函数,则该函数基本上毫无价值?@lstbl
lookaheads
不使用任何字符串。它们只是在一个位置后检查一个字符串。因此,您可以启动该函数,但正则表达式引擎仍然存在,因为在该函数运行后没有使用任何字符串。这是我最初使用的。我仍然有点困惑,为什么正则表达式引擎不能成功地确定匹配的长度(例如,如果正则表达式匹配的长度不是先验的,就像我的例子一样),因为它仍然能够确定是否有匹配。@lstbl,它可以
m.start()
m.end()
表示组0的跨度,该跨度为空。所以你只是误解了API。很好的答案。这是有道理的。@lstbl:注意,这个答案中的
regex
模块与您正在使用的标准库
re
模块完全不同。我没有注意到that@lstbl您需要通过
pip
或其他方式安装
regex
模块,这样您就可以开始了
[m.span(1) for m in re.finditer(r'(?=(([acgt])\2+))',sequence)]