正则表达式不擅长处理任意深度嵌套结构,应分清边界、借力工具、分层处理:先人工标注样本明确分隔符与目标,再依深度选择re模块(限浅层)、regex模块(支持递归)或专用解析器(如pylatexenc、beautifulsoup)。

正则表达式本身不擅长处理真正意义上的多层嵌套结构,比如任意深度的括号、标签或命令块。但通过策略性组合与工具选择,可以高效应对大多数实际场景——关键不是“硬刚递归”,而是分清边界、借力工具、分层处理。
先识别结构,再设计模式
拿到一段含嵌套的文本(如{{a{{b}}c}} {{d}}或\int{\frac{{dx}}{\sqrt{x}}}),别急着写正则。先人工标注几行样本:哪些是固定分隔符({{、}、{、})、哪些是可变内容、哪些是需排除的例外(如{{notmeeither}})。这一步能避免90%的盲目调试。
- 标出所有括号类型及配对关系(圆括号、花括号、方括号是否混用)
- 确认嵌套是否允许跨行、是否含转义字符或注释
- 明确目标:是提取全部层级?只取最外层?还是剥离嵌套后保留内容?
对简单嵌套:用非贪婪+逐层提取
当嵌套深度有限(≤3层)、结构较规整时,内置re模块足够用。核心是控制匹配范围,避免“吞掉”内部结构。
- 用
{([^{}]|\{[^{}]*\})*}这类模式匹配单层花括号,靠[^{}]跳过内部字符,靠\{[^{}]*\}捕获一层内嵌 - 配合
re.finditer()循环调用:先提取最外层,再对每个匹配结果递归解析其内容 - 避免
.*?在复杂上下文中引发回溯灾难;改用[^{}]+等明确否定字符类
对深度/混合嵌套:换用regex模块
Python标准re不支持递归引用,但第三方regex模块(pip install regex)提供(?R)和原子组(?>...),能可靠处理任意深度。
-
{{(?!(notmeeither))((?>[^{}]+|(?R))*)}}可精准匹配除特定例外外的所有{{...}}嵌套块 -
(?R)代表“重用整个模式”,实现自引用递归 -
(?>...)禁用回溯,防止.*类通配在深层嵌套中拖慢甚至卡死
对语法级嵌套:交给专用解析器
LaTeX公式、HTML、JSON、配置DSL等,本质是上下文相关语法,正则无法保证健壮性。此时应降级正则角色——仅做预处理或粗粒度切分,再交由专业工具。
- 用
re.split(r'(\{\{|\}\})', text)切出Anki模板中的{{...}}片段,再用regex或手工逻辑解析内部 - LaTeX推荐
pylatexenc:它把\frac{{dx}}{\sqrt{x}}转成带嵌套节点的AST,再遍历构建字典 - HTML用
BeautifulSoup,JSON用json.loads——它们天然处理嵌套,且容错强











