Python相当于Perl $ +又名$ LAST_PAREN_MATCH

时间:2017-03-15 12:47:16

标签: python perl regex-group

(如果这是重复的道歉,但不可能谷歌/搜索$+!)

我正在寻找与Perl的$+又名$LAST_PAREN_MATCH最接近/最佳等效。

对于那些不了解Perl的人,它的描述如下:

$LAST_PAREN_MATCH
$+      The text matched by the last bracket of the last successful search
        pattern. This is useful if you don't know which one of a set of
        alternative patterns matched.

如果我有(b)|(a)|(r)这样的模式,那么$+将包含bar,具体取决于匹配的子模式。

我拥有的最好的是

next((g for g in reversed(match.groups(None)) if g is not None),None)[0]

对于长期的Perl黑客来说,这似乎是一个简单的代码。 (并不是说我不知道​​我可以将它包装在函数last_paren_match(match)中: - )

2 个答案:

答案 0 :(得分:7)

在Python中可能没有等效项,但如果使用分支重置模式(?|...),则模式中的每个交替管道|将重置捕获的计数器变量。我非常确定Python会支持

在此示例中,所有捕获组都保存在$1

use strict;
use warnings 'all';
use feature 'say';

'zax' =~ /(?|(b)|(a)|(r))/;

say $1;

输出

a

答案 1 :(得分:1)

您可以使用MatchObject的lastindex属性:

  

最后匹配的捕获组的整数索引,如果没有匹配组,则为None。例如,如果应用于字符串(a)b,则表达式((a)(b))((ab))lastindex == 1'ab',而表达式(a)(b)将如果应用于同一个字符串,则为lastindex == 2

例如:

>>> import re
>>> m = re.match(r'(b)|(a)|(r)', 'abc')
>>> m.group(m.lastindex)
'a'

请注意,当您有嵌套捕获组时,这与Perl的$+不同:

$ python -c'import re; m = re.match(r"((a)(b))", "ab"); print m.group(m.lastindex)'
ab
$ perl -E'"ab" =~ /((a)(b))/; say $+'
b

就个人而言,我只是捕捉整个轮换,而不是单独捕捉每个替代方案:

>>> m = re.match(r'(b|a|r)', 'abc')
>>> m.group(1)
'a'