(如果这是重复的道歉,但不可能谷歌/搜索$+
!)
我正在寻找与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)
这样的模式,那么$+
将包含b
,a
或r
,具体取决于匹配的子模式。
我拥有的最好的是
next((g for g in reversed(match.groups(None)) if g is not None),None)[0]
对于长期的Perl黑客来说,这似乎是一个简单的代码。
(并不是说我不知道我可以将它包装在函数last_paren_match(match)
中: - )
答案 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'