如何获取平衡括号组的内容

Sch*_*nin 3 python regex

文本:

text1 = 'xx(aa)(bb)xx'
text2 = 'xx(aa(bb))xx'
Run Code Online (Sandbox Code Playgroud)

期待:

('aa', 'bb')  
('aa(bb)',  'bb')
Run Code Online (Sandbox Code Playgroud)

我的方法,但没有达到预期。

re.compile(r'\(\s?(.+?)\s?\)')
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 5

您可以安装PyPiregex模块并使用

import regex

texts = ['xx(aa)(bb)xx', 'xx(aa(bb))xx']
rx = r'\(((?:[^()]++|(?R))*)\)'

for text in texts:
    print(regex.findall(rx, text, overlapped=True))
Run Code Online (Sandbox Code Playgroud)

请参阅Python 演示。输出:

['aa', 'bb']
['aa(bb)', 'bb']
Run Code Online (Sandbox Code Playgroud)

正则表达式\(((?:[^()]++|(?R))*)\)是一个常见的符合 PCRE 的正则表达式,它匹配嵌套配对括号之间的字符串,我为括号之间的内容添加了一个捕获组。

要获取所有重叠的括号,该overlapped=True选项被传递给regex.findall