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

Eri*_*got 156 python regex regex-group

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

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

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

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

DSM*_*DSM 228

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

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

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

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

我对Perl开发人员(那些开发Perl语言的人)有一个不寻常的请求.我希望这个(perl5-porters)是正确的列表.我正在使用Python字符串sig,因为它是我在这里讨论的大部分工作的起源.

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

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

(?P<foo>...)与常规分组括号类似,但在
执行匹配后,可通过符号组名称"foo"访问组匹配的文本.

(?P=foo)匹配与名为"foo"的组匹配的字符串相同的字符串.相当于\ 1,\ 2等,除了该组是
按名称引用,而不是数字.

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

拉里沃尔回答说:

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

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

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

  • 哇,你确实在这里找到了一些好的和相关的历史数据!我对Guido的帖子的解释是"P"代表"特定于Python的扩展". (40认同)
  • "特定于Python的扩展"也许? (4认同)
  • +1这是最好的尴尬答案之一,是很好的辩护:).起初,我认为这太愚蠢了.但最后,我完全同意了. (2认同)
  • 我喜欢在参与Perl时,甚至Python的创建者也使用奇怪的奥术语法,而Perl社区对此完全满意。如果您尝试将Perl特定的扩展/语法添加到Python,那么到处都是鲜血。 (2认同)

Mik*_*ike 18

图案!该组命名(子)模式以供以后在正则表达式中使用.有关如何使用此类组的详细信息,请参阅此处的文档.

  • +1:这是一个很好的助记符设备:`(?P <name> ...)`是"pattern`name`".但是,在regexp中,一切都是模式,所以将`(?P <...> ...)`组标记为模式有点奇怪.不过,这对我的学生来说也是如此.:) (3认同)
  • @EOL 不要教学生虚假的东西。当您达到比您想象的精确时,它们更难切碎。例如。对我来说,有些需要“5”的数年倍数。矛盾的是,鼓励随便说话,只是总是非常清楚和明确 - 例如。将你之前的评论完整地告诉你的学生(也许修改最后一句话;)。 (2认同)

小智 18

Python 扩展。来自 Python 文档:

Perl 开发人员选择的解决方案是使用 (?...) 作为扩展语法。? 紧跟在括号之后是语法错误,因为 ? 没有什么可重复的,所以这不会引入任何兼容性问题。紧跟在 ? 之后的字符 指示正在使用的扩展名,因此 (?=foo) 是一回事(正向前瞻断言),而 (?:foo) 是另一回事(包含子表达式 foo 的非捕获组)。

Python 支持多个 Perl 的扩展,并在 Perl 的扩展语法中添加了扩展语法。如果问号后面的第一个字符是 P,你就知道它是一个特定于 Python 的扩展

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