正则表达式findall start()和end()?蟒蛇

时间:2013-07-11 22:17:59

标签: python regex sequence findall

我试图通过使用re.findall来按顺序获取查询的开始和结束位置

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

只会给我第一个实例

3 个答案:

答案 0 :(得分:12)

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

来自文档:

  

返回iteratorMatchObject个实例   字符串中RE模式的非重叠匹配。字符串是   从左到右扫描,并按找到的顺序返回匹配。

答案 1 :(得分:3)

你做不到。 findall是一个便利函数,正如the docs所说,返回“字符串列表”。如果您需要MatchObject的列表,则无法使用findall

但是,您可以使用finditer。如果您只是迭代匹配for match in re.findall(…):,则可以以相同的方式使用for match in re.finditer(…) - 除了获得MatchObject值而不是字符串。如果您确实需要列表,请使用matches = list(re.finditer(…))

答案 2 :(得分:1)

使用finditer而不是findall。这会让你返回一个产生MatchObject实例的迭代器,你可以从MatchObject获得开始/结束。