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

为什么Python正则表达式的跨度比实际匹配的跨度大一个位置?,python,regex,Python,Regex,查看我的正则表达式匹配返回的跨距,我注意到它们总是比实际匹配返回一个跨距;e、 g.在以下示例中: 打印(p.match('::message')) 没有一个 >>>m=p.search('::message');打印(m) >>>m.集团() “消息” >>>m.span() (4, 11) 示例中的结果范围是(4,11)与实际位置(4,10)。这给我带来了一些麻烦,因为左侧和右侧边界有不同的含义,我需要比较跨度的相对位置 有什么好的理由吗?或者我可以通过从右边界减去一来修改跨度以满足我的需

查看我的正则表达式匹配返回的跨距,我注意到它们总是比实际匹配返回一个跨距;e、 g.在以下示例中:

打印(p.match('::message')) 没有一个 >>>m=p.search('::message');打印(m) >>>m.集团() “消息” >>>m.span() (4, 11) 示例中的结果范围是
(4,11)
与实际位置
(4,10)
。这给我带来了一些麻烦,因为左侧和右侧边界有不同的含义,我需要比较跨度的相对位置


有什么好的理由吗?或者我可以通过从右边界减去一来修改跨度以满足我的需要吗?

因为在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'

因为在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'

这个答案应该是你的理解,这个答案应该是你的理解,我明白了,所以设计师们想要一种不分割任何东西的方法,而仍然提供索引。也就是说,他们希望“message”[x:x]返回空的。@Colin:没错;也可以看到一些有用的图表。我明白了,所以设计师想要一种方法,在仍然提供索引的情况下,什么都不分割。也就是说,他们希望“message”[x:x]返回空的。@Colin:没错;有关一些有用的图表,请参见。