6

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

"a=b" '鸟=天使'

我可以执行以下操作:

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

结果捕获了报价组,这在此处是不可取的。

4

2 回答 2

10

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

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

关于命名组扩展:

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

哪里的regular parentheses意思(...),对比(?:...)

于 2013-05-09T22:37:08.220 回答
3

您确实需要一个捕获组才能匹配相同的引号:没有其他机制re允许您这样做,除非明确区分两个引号:

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

(它的缺点是给你四个组,每种引用两个组)。

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

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

也可以。

总之,groups()[1:]如果可能的话,你最好使用它来获得你需要的东西。

于 2013-05-10T06:20:09.207 回答