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

时间:2016-01-13 18:17:00

标签: 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()方法的值相同。我之前注意到了这一点,最后使用的是m.start()+len(query_sequence),而不是m.end(),但我很困惑为什么会发生这种情况。

4 个答案:

答案 0 :(得分:4)

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]]

答案 1 :(得分:2)

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)]

答案 2 :(得分:1)

根据规定,您需要找到重叠匹配并需要前瞻。但是,您似乎知道您正在寻找的确切字符串。怎么样?

def find_overlapping(sequence, matchstr):
    for m in re.finditer('(?={})'.format(matchstr)):
        yield (m.start(), m.start() + len(matchstr))

或者,您可以使用第三方Python regex模块,如here所述。

答案 3 :(得分:1)

如果子序列的长度不是先验的,那么您可以在前瞻中使用匹配的组并取其span

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

E.g。找到所有重复的字符:

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