命名正则expression式组“(?P <组名> regexp)”:“P”代表什么?

在Python中, (?P<group_name>…) 语法允许通过名称引用匹配的string:

 >>> import re >>> match = re.search('(?P<name>.*) (?P<phone>.*)', 'John 123456') >>> match.group('name') 'John' 

“P”代表什么? 我在官方文档中找不到任何提示。

我很想知道如何帮助我的学生记住这个语法。 知道“P”代表什么(或可能代表)是有用的。

既然我们都在猜测,那么我还是应该给我的:我一直认为它代表Python。 这可能听起来很愚蠢 – 什么,P为Python? – 但在我的防守中,我依稀记得这条线 [我的重点]:

主题:声明(?P …)正则expression式语法扩展

From:Guido van Rossum(gui … @ CNRI.Reston.Va.US)

date:1997年12月10日下午3时36分19秒

我对Perl开发人员(开发Perl语言的人员)有不寻常的要求。 我希望这(perl5搬运工)是正确的名单。 我正在处理Python string-sig,因为这是我在这里讨论的大部分工作的起源。

你可能知道Python。 我是Python的创造者; 我打算在今年年底发布下一个“主要”版本,Python 1.5。 我希望Python和Perl可以在未来几年共存。 异花授粉对两种语言都有好处。 (我相信Larry在向Perl 5添加对象时对Python有很好的看法; O'Reilly出版了关于这两种语言的书籍。)

正如您所知,Python 1.5增加了一个新的正则expression式模块,它更接近Perl的语法。 我们试图在Python语法中尽可能接近Perl语法。 然而,正则expression式语法有一些特定于Python的扩展,它们都以(?P)开始,目前有两种:

(?P<foo>...)类似于常规分组圆括号,但文本
在比赛结束之后,通过符号组名称“foo”可以进行匹配。

(?P=foo)匹配与名为“foo”的组相匹配的string。 等同于“1”,“2”等除了该组被引用
以名字,而不是数字。

我希望这个特定于Python的扩展不会与Perl正则expression式的任何Perl扩展冲突。 如果你有计划使用(?P,请尽快告诉我们,这样我们可以解决冲突, 否则,如果(?P语法可以永久保留用于特定于Python的语法扩展)将会很好。有某种扩展registry?)

Larry Wall回答:

[…]目前还没有registry – 你的是来自外部的第一个请求,所以这是一个非常低的带宽活动。 (对不起,上周更低了 – 我在纽约的互联网世界。)

无论如何,就我而言,你一定会得到我的祝福。 (显然,Perl在这一点上不需要'P'。:-) […]

所以我不知道P的原始select是由什么模式驱动的? 占位? 企鹅? – 但是你可以理解为什么我总是把它和Python联系起来。 其中考虑到(1)我不喜欢正则expression式,并尽可能地避免它们;(2)十五年前发生的这种线索有点奇怪。

模式! 该组命名为(子)模式,以供以后在正则expression式中使用。 有关如何使用这些组的详细信息,请参阅此处的文档 。