是否可以在python中使用命名的非捕获组?例如,我想匹配此模式中的字符串(包括引号):
“A = B” '鸟=天使'
我可以做以下事情:
s = '"bird=angel"'
myre = re.compile(r'(?P<quote>[\'"])(\w+)=(\w+)(?P=quote)')
m = myre.search(s)
m.groups()
# ('"', 'bird', 'angel')
结果捕获了引用组,这在这里是不可取的。
答案 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:]
来获得所需内容。