在Python中什么是命名非捕获组?

6

在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')

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

2
为什么不在获取匹配项后忽略那个特定的捕获组呢? - Henry Keiter
如果有更多需要被忽略的命名组呢? - qed
2个回答

11
不,命名组始终是捕获组。来自re模块文档的说明:

扩展通常不会创建新组;(?P<name>...)是唯一的例外。

关于命名组扩展:

类似于普通圆括号,但组匹配的子字符串可以通过符号组名称name在正则表达式的其余部分中访问。

其中,普通括号指的是与(?:...)相对应的(...)

3

为了匹配相同的引用符,您确实需要使用捕获组:除非明确区分两个引用符,否则在re中没有其他机制可以实现这一点。

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

(这种方法的缺点是会给你四个组,每种引号风格都有两个组)。

需要注意的是,并不需要为引号命名:

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

工作也同样有效。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接