在Python中是否可以使用命名的非捕获组?例如,我想匹配这个模式中的字符串(包括引号):
"a=b" 'bird=angel'
我可以这样做:
s = '"bird=angel"'
myre = re.compile(r'(?P<quote>[\'"])(\w+)=(\w+)(?P=quote)')
m = myre.search(s)
m.groups()
# ('"', 'bird', 'angel')
结果捕获了引号组,这在这里是不可取的。
在Python中是否可以使用命名的非捕获组?例如,我想匹配这个模式中的字符串(包括引号):
"a=b" 'bird=angel'
我可以这样做:
s = '"bird=angel"'
myre = re.compile(r'(?P<quote>[\'"])(\w+)=(\w+)(?P=quote)')
m = myre.search(s)
m.groups()
# ('"', 'bird', 'angel')
re
模块文档的说明:关于命名组扩展:扩展通常不会创建新组;
(?P<name>...)
是唯一的例外。
其中,类似于普通圆括号,但组匹配的子字符串可以通过符号组名称name在正则表达式的其余部分中访问。
普通括号
指的是与(?:...)
相对应的(...)
。为了匹配相同的引用符,您确实需要使用捕获组:除非明确区分两个引用符,否则在re
中没有其他机制可以实现这一点。
myre = re.compile('"{0}"' "|'{0}'" .format('(\w+)=(\w+)'))
(这种方法的缺点是会给你四个组,每种引号风格都有两个组)。
需要注意的是,并不需要为引号命名:
myre = re.compile(r'([\'"])(\w+)=(\w+)\1')
工作也同样有效。
总之,如果可能的话,最好使用groups()[1:]
来获取您需要的内容。