我在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()
,但我很困惑为什么会发生这种情况。
答案 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))
答案 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)]