Python 正则表达式-如何获取匹配的位置和值

如何使用 re模块获取所有匹配的开始和结束位置?例如,给定模式 r'[a-z]'和字符串 'a1b2c3d4',我希望得到它找到每个字母的位置。理想情况下,我也希望拿回比赛的文本。

174980 次浏览
import re
p = re.compile("[a-z]")
for m in p.finditer('a1b2c3d4'):
print(m.start(), m.group())

正则表达式

Span ()返回单个元组中的开始索引和结束索引 Match 方法只检查 RE 是否在字符串的开始处匹配, Start ()始终为零 实例通过字符串进行扫描,因此匹配可能不从零开始 那样的话。

>>> p = re.compile('[a-z]+')
>>> print p.match('::: message')
None
>>> m = p.search('::: message') ; print m
<re.MatchObject instance at 80c9650>
>>> m.group()
'message'
>>> m.span()
(4, 11)

结合以下两点:

在 Python 2.2中,finditer ()方法也是可用的,它以迭代器的形式返回一个 MatchObject 实例序列。

>>> p = re.compile( ... )
>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator
<callable-iterator object at 0x401833ac>
>>> for match in iterator:
...     print match.span()
...
(0, 2)
(22, 24)
(29, 31)

你应该能够按照

for match in re.finditer(r'[a-z]', 'a1b2c3d4'):
print match.span()

对于 Python3.x

from re import finditer
for match in finditer("pattern", "string"):
print(match.span(), match.group())

对于字符串中的每次命中,您将获得 \n分隔的元组(分别由匹配的第一个和最后一个索引组成)和匹配本身。

请注意,span & group 是为正则表达式中的多个捕获组建立索引的

regex_with_3_groups=r"([a-z])([0-9]+)([A-Z])"
for match in re.finditer(regex_with_3_groups, string):
for idx in range(0, 4):
print(match.span(idx), match.group(idx))