Python 命名正则表达式组“;(?P<;集团名称>;regexp)";:什么是;P";代表

Python 命名正则表达式组“;(?P<;集团名称>;regexp)";:什么是;P";代表,python,regex,regex-group,Python,Regex,Regex Group,在Python中,(?p..)允许通过名称引用匹配的字符串: >>> import re >>> match = re.search('(?P<name>.*) (?P<phone>.*)', 'John 123456') >>> match.group('name') 'John' >>重新导入 >>>match=re.search(“(?P.*)(?P.*)”,“John 123456”) >>>match.gr

在Python中,
(?p..)
允许通过名称引用匹配的字符串:

>>> import re
>>> match = re.search('(?P<name>.*) (?P<phone>.*)', 'John 123456')
>>> match.group('name')
'John'
>>重新导入
>>>match=re.search(“(?P.*)(?P.*)”,“John 123456”)
>>>match.group('名称')
“约翰”
“p”代表什么?我在信中找不到任何暗示


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

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

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

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

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

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

我对Perl开发人员(开发 Perl语言)。我希望这是一份正确的名单。我 我正在抄送Python字符串sig,因为它是大多数 我在这里讨论的工作

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

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

(?p..)
类似于常规分组括号,但文本
在执行匹配后,可访问由组匹配的, 通过符号组名“foo”

(?p=foo)
与名为 “foo”。相当于\1、\2等,但该组被引用
按名字而不是数字

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

拉里·沃尔回答说:

[…]到目前为止还没有注册表--您的是来自的第一个请求 在perl5 porters之外,这是一个相当低的带宽活动。 (很抱歉,上周的价格更低了——我在纽约上网 世界。)

无论如何,就我而言,你肯定会对我的 祝福。(显然Perl此时不需要“P”。:-[…]


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

Python扩展。来自Python文档:

Perl开发人员选择的解决方案是使用(?…)作为 扩展语法。括号后面紧接着是语法错误 因为?没有什么可重复的,所以没有介绍 是否存在任何兼容性问题。字符是否紧随其后? 指示正在使用的扩展名,因此(?=foo)是一件事(a) 肯定的前瞻断言)和(?:foo)是另一个(a) 包含子表达式foo)的非捕获组

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


p
代表
占位符
@kev:似乎这应该是一个答案?既然猜测是恰当的,我猜想肯·汤普森是一个嬉皮士同情者,“p”代表“广藿香”。这个问题已添加到“组”下。顺便说一下,如果你使用
匹配.Groups
(带有
s
)当您真正想要的是
group('name')
=>
('John','123456')
时,您将静默地得到一个所有组的元组-=>
'John'
我希望这可以为您节省一些时间。“特定于Python的扩展”也许?哇,你确实在这里找到了一些很好的相关历史数据!我对Guido文章的解释是,“P”代表“Python特定扩展”.Yep,这在我看来是确定的。因此,讽刺的是,Perl和PCRE最初复制了语法,只是因为Python是第一个支持命名捕获的风格。但它们也支持
(?…)
syntax,这似乎是最流行的——现在连Java都支持它。+1这是一个很好辩护的最尴尬的答案:).起初,我认为这太愚蠢了。但最后,我完全同意了。我喜欢即使是Python的创建者在涉及Perl时也会使用奇怪的神秘语法,Perl社区对此完全没有意见。如果你试图在Python中添加特定于Perl的扩展/语法,那会让人流连忘返。+1:这是一个很好的记忆工具:
(?P…)
是“pattern
name
”。不过,在regexp中,一切都是一种模式,所以对o来说有点奇怪