当前位置: 首页 > 知识库问答 >
问题:

命名正则表达式组“(?Pregexp)”:P代表什么?

林丁雷
2023-03-14

在Python中,(?P

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

“P”代表什么?我在官方文件中找不到任何暗示。

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


共有3个答案

阎劲
2023-03-14

Python扩展。来自Python文档:

Perl开发人员选择的解决方案是使用(?...)作为扩展语法。?紧接着括号后面是语法错误,因为?没有什么可重复的,所以这没有引入任何兼容性问题。紧随其后的字符?说明正在使用什么扩展,所以(?=foo)是一件事(积极的展望断言)和(?: foo)是另一件事(包含子表达式foo的非捕获组)。

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

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

端木兴国
2023-03-14

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

裴华荣
2023-03-14

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

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

出发地:吉多·范·罗森(gui...@CNRI.Reston.Va.US)

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

我对Perl开发人员(那些开发Perl语言的开发人员)有一个不寻常的要求。我希望这个(perl5-搬运工)是正确的列表。我正在抄送Python字符串签名,因为它是我这里讨论的大部分工作的起源。

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

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

(?P

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

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

对此拉里·沃尔回答道:

[...]目前还没有注册表-您的是来自外部perl5-搬运工的第一个请求,所以这是一个相当低带宽的活动。(抱歉,上周的价格更低——我去了纽约的互联网世界。)

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

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

 类似资料:
  • 问题内容: 据我了解,该软件包不支持命名组(http://www.regular-expressions.info/named.html),所以有人可以将我指向具有此名称的第三方库吗? 我看过jregex,但是它的最新版本是2002年,它在java5下对我不起作用(承认我只是短暂地尝试过)。 问题答案: 每个名称只能具有一个命名组(你并不总是可以控制!),并且不能将它们用于正则表达式内递归。 注意

  • 我有3个正则表达式,但当模式匹配时执行相同的操作,所以我考虑将所有三个表达式合并为一个。我尝试了很多,但无法让“|”I.e”或“在我的正则表达式中工作 regex1:<代码>文本。替换(/([\u00A9-\u3299])/g,函数myFunction(x){…} regex2: regex3: 我试过这样做,但它不起作用regex:

  • 问题内容: 据我所知,JavaScript中没有所谓的捕获组。获得类似功能的替代方法是什么? 问题答案: ECMAScript 2018将命名捕获组引入了JavaScript正则表达式中。 例: 如果您需要支持较旧的浏览器,则可以使用命名捕获组来处理普通(编号)捕获组,而只需要跟踪编号-如果捕获组中的捕获组顺序很麻烦,正则表达式更改。 我能想到的命名捕获组只有两个“结构”优点: 在某些正则表达式中

  • 问题内容: 刚刚开始探索正则表达式的“奇迹”。作为一个从试验和错误中学习的人,我真的很努力,因为我的试验抛出了不成比例的错误……我的实验是在PHP中使用ereg()进行的。 无论如何。我分别使用名字和姓氏,但现在使用相同的正则表达式。到目前为止,我有: 任何以大写字母开头且其余仅包含字母(大写或不大写)的长度字符串。但是我分崩离析的地方是在几乎任何地方都可能发生的特殊情况下。 连字符(Worthi

  • 我正在试图理解是什么意思。即使我将其删除,该表达式的工作原理也是一样的,即: 我知道我可以用引用匹配的模式。是什么?

  • 昨天,我需要向正则表达式添加一个文件路径,创建一个如下所示的模式: 一开始正则表达式不匹配,因为包含几个正则表达式特定的符号,如 或 。作为快速修复,我将它们替换为 和 . 与 . 然而,我问自己,是否没有一种更可靠或更好的方法来清除正则表达式特定符号中的字符串。 Python 标准库中是否支持此类功能? 如果没有,您是否知道一个正则表达式来识别所有正则表达式并通过替代品清理它们?