命名正则表达式组&quot (?P<group_name>regexp)&quot:什么&quot P"代表什么?

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

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

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

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

190218 次浏览

模式!组命名一个(子)模式,以便以后在正则表达式中使用。有关如何使用这些组的详细信息,请参见文档在这里

既然我们都在猜测,我不妨给出我的答案:我一直认为它代表Python。这听起来可能很愚蠢——什么,P代表Python?!——但在我的辩护中,我隐约记得这个线程[强调我的]:

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

来自:Guido van Rossum (gui...@CNRI.Reston.Va.US)

时间:1997年12月10日下午3:36:19

我有一个不寻常的要求Perl开发人员(那些开发 Perl语言)。我希望这个(perl5-porters)是正确的列表。我 我抄送Python string-sig,因为它是大多数的起源

你可能知道Python。我是Python的创造者;我是 计划在年底前发布下一个“主要”版本,Python 1.5 今年。我希望Python和Perl能够在未来几年共存; 异花授粉对两种语言都有好处。(我相信拉里 当他向Perl 5添加对象时,他很好地了解了Python;O ' reilly 出版关于两种语言的书籍)

如你所知,Python 1.5增加了一个新的正则表达式模块 更接近Perl语法。我们尽量靠近 尽可能在Python语法中使用Perl语法。然而,正则表达式 语法有一些特定于python的扩展,它们都以(?P。 目前有两个:

(?P<foo>...)类似于常规的分组括号,但文本
组匹配后可访问,

.通过符号组名“foo”

(?P=foo)匹配与组name匹配的相同字符串 “foo”。等价于\1,\2等,除了组被引用为

.

. 我希望这个特定于python的扩展不会与任何扩展冲突 Perl正则表达式语法的未来Perl扩展。如果你有计划的话 使用(?P,请尽快让我们知道,以便我们解决 冲突。否则,如果(?P语法可以是 永久地为特定于python的语法扩展保留。< / >强 是否存在某种扩展注册表?)

拉里·沃尔回答说:

< p >[…目前还没有注册表——你的是第一个请求 在perl5-porters之外,所以这是一个相当低带宽的活动。 (对不起,上周的工资更低——我去纽约上网了 世界。)< / p > 不管怎样,就我所知,你肯定可以把“p”和“my”放在一起 祝福。(显然Perl在这一点上不需要'P'。:-) [...]

我不知道最初选择P的动机是什么,模式?占位符?企鹅吗?但是你可以理解为什么我总是把它和Python联系在一起。考虑到(1)我不喜欢正则表达式,尽可能避免使用它们,(2)这个线程发生在15年前,有点奇怪。

Python扩展。来自Python文档:

Perl开发人员选择的解决方案是使用(?…)作为 扩展语法。? 紧跟在括号后面的是语法错误 因为?就没有什么可重复的,所以这就不介绍了吗 兼容性问题。紧接在? 指示正在使用的扩展名,因此(?=foo)是一件事(a 正向前向断言)和(?:foo)是另一个东西(a 包含子表达式foo的非捕获组).

Python支持几个Perl的扩展,并添加了一个扩展 Perl的扩展语法。如果是 问号是一个P,你知道它是一个特定的扩展 Python < /强> < / p >

https://docs.python.org/3/howto/regex.html