2013-07-11 3 views
4

я пытаюсь получить начальную и конечную позиции запроса в последовательности, используя re.findallRegex 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 Вернуть экземпляры, дающие MatchObject над всеми неперекрывающимися совпадениями для шаблона RE в строке. Строка проверяется слева направо, а совпадения возвращаются в указанном порядке.

+0

Вместо '[m.start(), m.end()]' вы также можете просто использовать 'm.span()', который возвращает кортеж начальных и конечных знаков. –

1

Используйте finditer вместо findall. Это возвращает вам итератор с экземплярами MatchObject, и вы можете получить начало/конец из MatchObject.

3

Вы не можете. findall - функция удобства, которая, как говорят the docs, возвращает «список строк». Если вы хотите получить список MatchObject s, вы не можете использовать findall.

Тем не менее, вы может использовать finditer. Если вы просто перебираете по спичкам for match in re.findall(…):, вы можете использовать for match in re.finditer(…) тем же способом, за исключением того, что вы получаете значения MatchObject вместо строк. Если вам действительно нужен список, просто используйте matches = list(re.finditer(…)).

Смежные вопросы