为什么Python正则表达式跨度比实际匹配延伸一个位置?

时间:2014-10-10 10:24:04

标签: python regex

观察我的正则表达式比赛中返回的跨度,我注意到他们总是在实际比赛之后返回一个;例如在Regular Expression HOWTO

的示例中
>>> print(p.match('::: message'))
None
>>> m = p.search('::: message'); print(m)  
<_sre.SRE_Match object at 0x...>
>>> m.group()
'message'
>>> m.span()
(4, 11)

示例中的结果范围是(4, 11)与实际位置(4, 10)。这给我带来了一些麻烦,因为左手和右手的边界有不同的含义,我需要比较跨度的相对位置。

这是否有充分的理由,或者我可以通过从右边界减去一个来改变我喜欢的范围吗?

1 个答案:

答案 0 :(得分:4)

因为在Python中,切片和范围永远不会是最终值,而'::: message'[4:11]反映实际匹配的文本:

>>> '::: message'[4:11]
'message'

因此,您可以使用MatchObject.span()结果从原始字符串中对匹配的文本进行切片:

>>> import re
>>> s = '::: message'
>>> match = p.search(s)
>>> match.span()
(4, 11)
>>> s[slice(*match.span())]
'message'