观察我的正则表达式比赛中返回的跨度,我注意到他们总是在实际比赛之后返回一个;例如在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)
。这给我带来了一些麻烦,因为左手和右手的边界有不同的含义,我需要比较跨度的相对位置。
这是否有充分的理由,或者我可以通过从右边界减去一个来改变我喜欢的范围吗?
答案 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'