【问题标题】:Named regular expression group "(?P<group_name>regexp)": what does "P" stand for?命名正则表达式组“(?P<group_name>regexp)”:“P”代表什么?
【发布时间】:2012-04-21 00:39:00
【问题描述】:

在 Python 中,(?P&lt;group_name&gt;…)syntax 允许通过其名称引用匹配的字符串:

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

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

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

【问题讨论】:

  • P 代表Placeholder
  • @kev:看起来应该是一个答案?
  • 既然猜测是正确的,我猜想肯汤普森是一个嬉皮士同情者,“P”代表“广藿香”。
  • 此问题已添加到Stack Overflow Regular Expression FAQ 的“群组”下。
  • 顺便说一句,如果你使用match.groups(带有s)你会默默地得到一个all组的元组-_- groups('name') => @ 987654331@ 当你真正想要的是 group('name') => 'John' 我希望这可以在某个地方节省一些时间。

标签: python regex regex-group


【解决方案1】:

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

【讨论】:

  • +1:这是一个很好的助记符:(?P&lt;name&gt;…) 是“模式name”。但是,在正则表达式中,一切都是模式,因此仅将 (?P&lt;…&gt;…) 组标记为模式有点奇怪。不过,这对我的学生来说是可行的。 :)
  • @EOL 不要教学生虚假的东西。当你达到精确度时,它们比你想象的更难撕掉。例如。对我来说,有些需要5 的数年倍数。矛盾的是,鼓励随便说话,只是总是非常清楚和明确 - 例如。将您之前的评论完整地告诉您的学生(可能会修改最后一句话;)。)
【解决方案2】:

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

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

发件人:Guido van Rossum (gui...@CNRI.Reston.Va.US)

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

我对 Perl 开发人员(那些开发 Perl 语言)。我希望这个(perl5-porters)是正确的列表。一世 我正在抄送 Python 字符串签名,因为它是大多数 我在这里讨论的工作。

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

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

(?P&lt;foo&gt;...) 类似于常规的分组括号,但文本
执行匹配后,可以访问由组匹配的, 通过符号组名“foo”。

(?P=foo) 匹配与名为的组匹配的相同字符串 “富”。等效于 \1、\2 等,但组被引用
按名称而不是编号。

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

Larry Wall 回复:

[...] 目前还没有注册表——您的第一个请求是 在 perl5-porters 之外,所以这是一个非常低带宽的活动。 (抱歉,上周甚至更低——我在纽约上网 世界。)

无论如何,就我而言,你可能肯定有我的“P” 祝福。 (显然 Perl 在这一点上不需要 'P'。:-) [...]

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

【讨论】:

  • “Python 特定的扩展”也许?
  • 哇,您确实在这里找到了一些很好且相关的历史数据!我对 Guido 帖子的解释是,“P”代表“Python-specific extensions”。
  • 是的,这对我来说是确定的。因此,具有讽刺意味的是,Perl 和 PCRE 最初复制了语法,只是因为 Python 是第一个支持命名捕获的版本。但它们也支持(?&lt;group_name&gt;…) 语法,这似乎是最流行的——甚至 Java 现在也支持它。
  • +1 这是最好的尴尬答案之一,得到很好的辩护:)。起初,我认为这太愚蠢了。但最后,我完全同意了。
  • 我喜欢即使是 Python 的创建者在涉及 Perl 时也会使用奇怪的晦涩语法,而 Perl 社区对此完全没有意见。如果你试图向 Python 添加特定于 Perl 的扩展/语法,那将会是鲜血淋漓。
【解决方案3】:

Python 扩展。来自 Python 文档:

Perl 开发人员选择的解决方案是使用 (?...) 作为 扩展语法。 ?括号后立即是语法错误 因为?没有什么可重复的,所以这里没有介绍 任何兼容性问题。紧随其后的字符? 表明正在使用什么扩展,所以 (?=foo) 是一回事(a 积极的前瞻断言)和 (?:foo) 是别的东西(a 包含子表达式 foo) 的非捕获组。

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

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

【讨论】:

  • 好发现!这证实了帝斯曼的感觉。
猜你喜欢
  • 2013-01-31
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 2014-11-16
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
相关资源
最近更新 更多