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

时间:2008-10-30 14:04:34

标签: python regex

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

4 个答案:

答案 0 :(得分:115)

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

答案 1 :(得分:45)

取自

Regular Expression HOWTO

  

span()在单个元组中返回开始和结束索引。自从   match方法只检查RE在字符串开头是否匹配,   start()始终为零。但是,RegexObject的搜索方法   实例扫描字符串,因此匹配可能不会从零开始   在那种情况下。

>>> 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()

答案 2 :(得分:14)

对于Python 3.x

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

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

答案 3 :(得分:0)

请注意,将跨度和组索引为正则表达式中的多个捕获组

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))