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

时间:2012-04-08 01:18:01

标签: python regex regex-group

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

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

“P”代表什么?我在official documentation找不到任何提示。

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

3 个答案:

答案 0 :(得分:206)

既然我们都在猜测,我不妨放弃一下:我一直以为它代表Python。这可能听起来很愚蠢 - 什么,P for Python?! - 但在我的辩护中,我隐约记得this thread [强调我的]:

  

主题:声明(?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;奥赖利   出版有关两种语言的书籍。)

     

您可能知道,Python 1.5添加了一个新的正则表达式模块   更接近Perl的语法。我们试图尽可能接近   在Python的语法中尽可能使用Perl语法。但是,正则表达式   语法有一些特定于Python的扩展,它们都以(?P。   目前有两个:

     

(?P<foo>...)类似于常规分组括号,但文字为   在比赛结束后,可以访问该组匹配的,   通过符号组名称“foo”。

     

(?P=foo)匹配与命名组匹配的字符串相同的字符串   “富”。相当于\ 1,\ 2等,除了该组被引用   按名称,而不是数字。

     

我希望这个特定于Python的扩展不会与任何特定的扩展冲突   未来Perl对Perl正则表达式语法的扩展。如果你有计划   使用(?P,请尽快告诉我们,以便我们解决问题   冲突。 否则,如果(?P语法可能是这样的话)会很好   永久保留用于特定于Python的语法扩展。(是   有某种扩展注册表?)

拉里沃尔回答说:

  

[...]目前还没有注册表 - 你的第一个请求来自   在perl5-porters之外,所以这是一个相当低带宽的活动。   (对不起,它上周甚至更低 - 我在纽约的互联网上   世界。)

     

无论如何,就我而言,你肯定和我有'P'   祝福。 (显然Perl此时不需要'P'。:-) [...]

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

答案 1 :(得分:17)

模式!该组命名(子)模式以供以后在正则表达式中使用。有关如何使用此类组的详细信息,请参阅the documentation here

答案 2 :(得分:3)

Python扩展。从Python Docos:

  

Perl开发人员选择的解决方案是使用(?...)作为   扩展语法。 ?括号后是语法错误   因为?无需重复,因此没有介绍   任何兼容性问题。 ?之后的字符   指出正在使用的扩展名,所以(?= foo)是一回事(a   正向超前断言)和(?:foo)是其他内容(a   包含子表达式foo的非捕获组。

     

Python支持Perl的多个扩展,并添加了一个扩展   Perl扩展语法的语法。如果   问号是P,您知道它是特定于扩展名的   到Python

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