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


112

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


看看这是否对匹配对象有
EBGreen

Answers:


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

3
这不提供匹配regex = r'([az])(0-9)'中其他组的索引。m.start将用于group(),而不是group(1)
StevenWernerCS

@StevenWernerCS start()可能会接受一个组号,因此,如果您想要第n个组的索引,请使用start(n)
Hi-Angel

@ hi-angel是的,请看下面我去年的回答:
StevenWernerCS

51

取自

正则表达式操作方法

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

您可以使用它像re.search(r'abbit', "has abbit of carrot").span(0)-(4, 9)
КонстантинВан

由返回的“结束索引” span()就像Python的分片符号中的“停止”一样,它上升到但不包括该索引;看这里
韦恩

20

对于Python 3.x

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

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


2

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

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

1
谢谢,这已被证明是超级有用的,而且似乎已经被埋葬了。此外,万一有人需要:使用命名捕获组时,可以使用<match> .re.groupindex查找组的索引,然后使用您概述的方法从那里找到对应的跨度
madimov,

哪里4来的?
无线电控制的

@RadioControlled number_of_known_groups_in_the_regex + 1,因为范围是[start,end)不包括结尾
StevenWernerCS

@StevenWernerCS,因此它不能推广到未知组数的情况...
无线电控制
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.