re.finditer() 为开始和结束方法返回相同的值

re.finditer() returning same value for start and end methods

我在使用 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_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))

或者,您可以使用 third-party Python regex module, as described here.

regex模块支持与finditer重叠:

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

如果不知道子序列的长度a-priori,那么你可以在lookahead中使用匹配组并取其span:

[m.span(1) for m in re.finditer(r'(?=(gatttaacg))',sequence)] == [(22,31)]

例如查找所有重复的字符:

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