我希望这个Python特定的扩展不会与任何未来的Perl扩展冲突。如果您计划使用(?P,请尽快告诉我们,以便我们可以解决冲突。否则,最好将(?P语法永久保留用于Python特定的语法扩展。(是否有某种扩展注册表?)
Larry Wall回答道:
[...]到目前为止还没有注册表——你们是perl5-porters外部的第一批请求,所以它是一个非常低带宽的活动。(很抱歉上周甚至更低—I在纽约参加了互联网世界大会。)
无论如何,就我而言,你肯定可以拥有'P',我给予祝福。(显然,此时Perl不需要'P'。:-) [...]
所以我不知道最初选择P的动机是什么——模式?占位符?企鹅?但您可以理解为什么我一直将其与Python相关联。考虑到(1)我不喜欢正则表达式并尽可能避免使用它们,以及(2)这个线程发生在十五年前,这有点奇怪。
(?<group_name>…)
语法,似乎是最受欢迎的——即使 Java 现在也支持它。 - Alan MoorePython扩展。来自Python文档:
Perl开发人员选择的解决方案是使用(?...)作为扩展语法。 括号后面紧跟着?是一个语法错误,因为?没有要重复的内容, 所以这不会引入任何兼容性问题。紧随?之后的字符指示使用了什么扩展, 所以(?=foo)是一种东西(正向先行断言)而(?:foo)是另一种东西 (包含子表达式foo的非捕获组)。
Python支持Perl的几个扩展并添加了一个扩展语法到Perl的扩展语法中。 如果问号后的第一个字符是P,你就知道它是一个特定于Python的扩展
Pattern!(模式!)这个组在正则表达式中用来命名(子)模式以供后续使用。有关此类组如何使用的详细信息,请参见此处的文档。
(?P<name>…)
表示“模式名称”。“正则表达式”中的所有内容都是模式,因此仅标记(?P<...>...)
组作为模式有点奇怪。但对于我的学生来说,这已经足够了。 :) - Eric O. Lebigot
P
代表占位符
。 - kev(?<name>...)
语法和当前的(?P<name>...)
语法来命名分组。 - AXOmatch.groups
(有一个s
),您将会悄悄地得到一个包含所有组的元组 -_-groups('name')
=>('John', '123456')
,而您实际上想要的是group('name')
=>'John'
希望这能为某人节省时间。 - szmoore