非捕获组内的捕获组

5
我想捕获两个组,但其中一个位于一个非捕获组内,例如:
import re

text = 'column{fields}'
parsed = re.search(r'(\w+)(?:{(\w+)})', text)
parsed.groups() # prints ('column', 'fields')

那样做是可行的,但如果我的文本只有'column',那么regex就是NoneType。
1个回答

2
您可以将第二个非捕获组设置为可选项:
>>> text = 'column'
>>> parsed = re.search(r'(\w+)(?:{(\w+)})?', text)
>>> parsed.groups()
('column', None)

(?:{(\w+)})?末尾的?会使得column后面的部分,即(?:{(\w+)})成为可选项。请注意保留HTML标签。

我曾以为在 (?:{(\w+)}) 中,我实际上是在声明 {(\w+)} 为可选项。为什么不是呢? - whitenoisedb
为了使正则表达式中的任何部分变成可选项,您需要在其后面放置“?”(如答案所示)。 - anubhava
是的,但我认为 ( ... )?(?: ... ) 是一样的。那么,(?: ... )? 就是多余的吗? - whitenoisedb
没有 (?:...) 表示非捕获组。它是一个不会被捕获并且不能在反向引用中使用的组。这并不意味着它是可选的。 - anubhava
感谢您的澄清。 - whitenoisedb

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