在python中命名为非捕获组?

时间:2013-05-09 21:53:02

标签: python regex

是否可以在python中使用命名的非捕获组?例如,我想匹配此模式中的字符串(包括引号):

“A = B” '鸟=天使'

我可以做以下事情:

s = '"bird=angel"'
myre = re.compile(r'(?P<quote>[\'"])(\w+)=(\w+)(?P=quote)')
m = myre.search(s)
m.groups()
# ('"', 'bird', 'angel')

结果捕获了引用组,这在这里是不可取的。

2 个答案:

答案 0 :(得分:6)

不,命名组总是捕获组。来自re模块的文档:

  

扩展程序通常不会创建新组; (?P<name>...)是   这条规则唯一例外。

关于指定的群组扩展名:

  

常规括号类似,但该组匹配的子字符串   可以在正则表达式的其余部分通过   符号组名称

其中regular parentheses表示(...),与(?:...)相比。

答案 1 :(得分:3)

需要一个捕获组以匹配相同的引用:re中没有其他机制允许你这样做,简短明确区分这两个引号:

myre = re.compile('"{0}"' "|'{0}'" .format('(\w+)=(\w+)'))

(它的缺点是为您提供四个组,每种报价方式两个)。

请注意,不需要为引号命名:

myre = re.compile(r'([\'"])(\w+)=(\w+)\1')  

也可以。

总之,如果可能的话,最好只使用groups()[1:]来获得所需内容。