9

我正在尝试使用 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

只会给我一审

4

3 回答 3

21

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

从文档:

返回字符串中 RE 模式的所有非重叠匹配的iterator产生实例。MatchObject从左到右扫描字符串,并按找到的顺序返回匹配项。

于 2013-07-11T22:20:49.523 回答
3

你不能。findall是一个便利函数,正如文档所说,它返回“字符串列表”。如果你想要一个MatchObjects 列表,你不能使用findall.

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

于 2013-07-11T22:21:58.193 回答
1

使用 finditer 而不是 findall。这为您提供了一个产生 MatchObject 实例的迭代器,您可以从 MatchObject 获取开始/结束。

于 2013-07-11T22:21:53.390 回答