Python正则表达式获取组位置

8

这是我的代码:

a = '/afolder_l/location/folder_l/file.jpg'
p= re.compile("/.+/location/.+_([lr])/")
m = p.match(a)

现在,print m.group(1)会输出l,但我也想要该组的位置。目前,m.span()返回一个包含所有文本位置的元组。如何只获取'l'的位置?或者说,因为这是我正在分组的内容,所以怎样才能获取'r'的位置呢?


我不确定为什么它没有正确地格式化。正在手机上输入此内容。 - Arvizard
2个回答

17

您需要引用组号

>>> import re
>>>
>>> a = '/afolder_l/location/folder_l/file.jpg'
>>> p= re.compile("/.+/location/.+_([lr])/")
>>> m = p.match(a)
>>> m.span()
(0, 29)
>>> m.span(1)
(27, 28)

如果您打算使用m.group(i)获取匹配的字符串,那么使用组名可能更可靠,因为当您使用m.groupdict()[groupname]获取字符串时,m.group(i)可能会有奇怪的行为,这一点并不明显。例如:使用re.compile("/.+/location/.+_(?P<f_letter>[lr])/"),然后使用m.span('f_letter')和m.groupdict()['f_letter']来获取。 - markling
这很棘手,也许您可以添加更多的解释,这样谷歌就可以将其他人引导到这里了? - Private

5
您可以使用SRE_Match对象.span()方法,其中输入整数参数作为组号。
以下是一些更具清晰度的示例。如果您使用3个()组,则组0将是完全匹配的,使用1到3的整数数字作为参数输入将匹配每个组号的索引和相应的.group().span()方法。希望这能帮助您!
>>> import re
>>> regex = re.compile(r"(\d{4})\/(\d{2})\/(\d{2})")
>>> text = "2019/12/31"
>>> matched = regex.match(text)
>>> matched
<_sre.SRE_Match object; span=(0, 10), match='2019/12/31'>

>>> matched.groups()
('2019', '12', '31')
>>> matched.span()
(0, 10)

>>> matched.group(0)
'2019/12/31'
>>> matched.span(0)
(0, 10)

>>> matched.group(1)
'2019'
>>> matched.span(1)
(0, 4)

>>> matched.group(2)
'12'
>>> matched.span(2)
(5, 7)

>>> matched.group(3)
'31'
>>> matched.span(3)
(8, 10)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接