在Perl的正则表达式语法中,是否可以像Python的语法一样执行命名组匹配?我总是在匹配后将$n
值绑定到适当的名称,所以如果可能的话,我会发现在正则表达式本身中执行此操作更方便。
Python是这样做的:
>>> import re
>>> regex = re.compile(r'(?P<count>\d+)')
>>> match = regex.match('42')
>>> print match.groupdict()
{'count': '42'}
我知道?P
表明它是Python特有的regex特性,但我希望它在Perl中以不同的方式存在,或者是后来添加的。在Perl中有没有办法以类似的方式获得结果散列?
5条答案
按热度按时间esyap4oy1#
Perl使用
(?<NAME>pattern)
来指定名称捕获。您必须使用%+
散列来检索它们。不过,只有Perl 5.10和更高版本才支持此功能。
rur96b6h2#
从Perl 5.10开始,Perl正则表达式支持一些Python特性,我想这使它们与 Python 兼容。Python版本中有“P”,但所有这些都在Perl 5.10中工作。有关详细信息,请参见perlre文档:
定义已命名的捕获缓冲区。相当于
(?<NAME>pattern)
。反向指涉具名撷取缓冲区。相当于
\g{NAME}
。对已命名捕获缓冲区的子例程调用。等效于
(?&NAME)
。尽管我没有将Python兼容性添加到最新版本的Learning Perl中,但我们确实介绍了Perl 5.10的新特性,包括命名捕获。
dbf7pr2w3#
正如一些人所说,perl5.10已经命名了组。
但是在以前的perls中,你可以做一些事情,虽然不那么方便,但是相对来说很好:
然后您可以用途:
$hash{“计数”}和$hash{“其他内容”}。
tvz2xvvm4#
AFIK PCRE将组捕获命名为:
你可以在这里找到信息。
gupuwyp25#
我使用
%{^CAPTURE}
哈希(为了可读性)。这是English版本的
%+
,如上文Leon Timmermans所述。例如,我为捕获PHP版本编写的代码:
在regex模式中,您可以将命名的捕获组引用为
\g{NAME}
。TIMTOWTDI,所以请使用最适合您的版本。