Python re.finditer()为start和end方法返回相同的值
python中的re.finditer()方法有问题。例如: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()方法给出了相同的值。我以前
>>>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函数,则该函数基本上毫无价值?@lstbllookaheads
不使用任何字符串。它们只是在一个位置后检查一个字符串。因此,您可以启动该函数,但正则表达式引擎仍然存在,因为在该函数运行后没有使用任何字符串。这是我最初使用的。我仍然有点困惑,为什么正则表达式引擎不能成功地确定匹配的长度(例如,如果正则表达式匹配的长度不是先验的,就像我的例子一样),因为它仍然能够确定是否有匹配。@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)]