2013-07-11 63 views
4

我試圖通過使用re.findall正則表達式findall start()和end()? Python的

import re 

sequence = 'aaabbbaaacccdddeeefff' 

query = 'aaa' 

findall = re.findall(query,sequence) 

>>> ['aaa','aaa'] 

如何獲得類似findall.start得到的序列查詢的起始和結束位置()或findall.end()?

我想獲得

start = [0,6] 
end = [2,8] 

我知道

search = re.search(query,sequence) 

print search.start(),search.end() 

>>> 0,2 

會給我只是一審

回答

8

使用re.finditer

>>> import re 
>>> sequence = 'aaabbbaaacccdddeeefff' 
>>> query = 'aaa' 
>>> r = re.compile(query) 
>>> [[m.start(),m.end()] for m in r.finditer(sequence)] 
[[0, 3], [6, 9]] 

從文檔:

返回iterator產生超過在串中的RE圖案所有 非重疊匹配MatchObject實例。該字符串是從左到右掃描的 ,匹配按找到的順序返回。

+0

除了[m.start(),m.end()]之外,還可以使用'm.span()'返回起始和結束索引的元組。 –

1

使用finditer而不是findall。這會讓您返回一個產生MatchObject實例的迭代器,您可以從MatchObject獲取開始/結束。

3

你不行。 findall是一種便利功能,如the docs所示,返回「字符串列表」。如果你想要一個MatchObject的列表,你不能使用findall

但是,您可以使用finditer。如果您只是遍歷for match in re.findall(…):的匹配項,則可以使用for match in re.finditer(…)相同的方式 - 除了獲取MatchObject值而不是字符串。如果您確實需要列表,請使用matches = list(re.finditer(…))