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

Posted

技术标签:

【中文标题】正则表达式 findall start() 和 end() ? Python【英文标题】:Regex findall start() and end() ? Python 【发布时间】:2013-07-10 09:08:27 【问题描述】:

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

只会给我第一个实例

【问题讨论】:

【参考方案1】:

使用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 模式的非重叠匹配。字符串是 从左到右扫描,并按找到的顺序返回匹配项。

【讨论】:

你也可以只使用m.span(),而不是[m.start(), m.end()],它返回一个开始和结束索引的元组。 您的代码失败 -> 序列 = 'aaadaa' 查询 = 'aa' ,您的输出 (0, 2) (4, 6) ,正确的输出 (0, 1) (1, 2) (4, 5) @SanjitPrasad 它在引用的文字中清楚地说:“所有非重叠匹配......” 抱歉,如果我们也需要找到重叠匹配项怎么办。【参考方案2】:

你不能。 findall 是一个便利函数,就像 the docs 说的那样,返回“字符串列表”。如果你想要MatchObjects 的列表,你不能使用findall

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于正则表达式 findall start() 和 end() ? Python的主要内容,如果未能解决你的问题,请参考以下文章

python)使用正则表达式查找所有匹配项(从 re.search 更改为 re.findall)[重复]

python - 正则表达式搜索和 findall

python正则表达式01--贪心算法和非贪心算法findall()

python正则表达式02--findall()和search()方法区别,group()方法

python 正则表达式,怎样匹配以某个字符串开头,以某个字符串结尾的情况?

python 正则(re.compile()/re.findall())