如何用Python正则提取嵌套括号中的顶级括号内容?
提取顶级大括号内的文本(处理嵌套括号)
我有一个包含嵌套括号的字符串,需要用Python正则表达式解析顶级括号内的文本。示例代码如下:
import re string = '{a {b} c} {d}' # 期望输出: ['a {b} c', 'd'] # 非贪婪模式 pattern_1 = r'(?<={).*?(?=})' print(re.findall(pattern_1, string)) # 实际输出: ['a {b', 'd'] # 贪婪模式 pattern_2 = r'(?<={).*(?=})' print(re.findall(pattern_2, string)) # 实际输出: ['a {b} c} {d']
使用贪婪模式时匹配结束过晚,非贪婪模式则结束过早,请问该如何实现需求?
解决方案:用递归正则匹配平衡括号
普通的贪婪/非贪婪模式无法识别括号的层级关系,自然处理不了嵌套场景。在Python 3.10及以上版本中,标准re模块支持递归正则表达式,可以通过递归逻辑匹配嵌套的平衡括号。
实现代码
import re string = '{a {b} c} {d}' # 递归正则:匹配完整的顶级{...}结构,内部允许嵌套{...} pattern = r'\{(?:[^{}]|(?R))*\}' # 提取匹配结果并去掉首尾的大括号 result = [match[1:-1] for match in re.findall(pattern, string)] print(result) # 输出: ['a {b} c', 'd']
代码说明
\{:匹配开头的左大括号(?:[^{}]|(?R))*:非捕获组,匹配两种内容:要么是非大括号的普通字符,要么是递归匹配整个模式(即嵌套的{...})\}:匹配结尾的右大括号- 最后通过列表推导式剔除每个匹配结果首尾的大括号,得到顶级括号内的目标文本
如果你的Python版本低于3.10,可以安装第三方库regex(执行pip install regex),它更早支持递归匹配,用法和上述代码一致:
import regex string = '{a {b} c} {d}' pattern = r'\{(?:[^{}]|(?R))*\}' result = [match[1:-1] for match in regex.findall(pattern, string)] print(result) # 输出: ['a {b} c', 'd']
内容的提问来源于stack exchange,提问作者zest16
相关产品推荐
相关产品推荐

