You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python正则如何匹配含嵌套花括号的LaTeX \textbf{}内部文本

问题原因

你之前使用的(?R)元字符作用是递归匹配整个正则表达式的完整规则。当你在正则前加了\\textbf前缀后,递归匹配内部嵌套花括号时,会要求子串也必须带\\textbf前缀,自然无法匹配内部不带前缀的普通嵌套花括号结构,导致匹配结果缺失。

正确实现方案

Python 标准库re不支持递归正则,需要使用第三方regex库实现,核心思路是放弃全模式递归,只针对「成对花括号」的子规则做递归,避免前缀干扰。

正则写法与示例代码

import regex

cnt = r"""
1. \textbf{adadasas}
2. \textbf{adadasas \textit{xxx} adasda {xxx}}
3. \textbf{adadasas {} {} {} dxxxx}
"""

# 正则模式说明:匹配\textbf开头后,递归匹配所有嵌套花括号,捕获括号内全部内容
pattern = r'\\textbf({((?:[^{}]++|(?1))*)})'
result = [match.group(2) for match in regex.finditer(pattern, cnt)]

print(result)
# 输出:['adadasas', 'adadasas \\textit{xxx} adasda {xxx}', 'adadasas {} {} {} dxxxx']

模式逻辑拆解

  • \\textbf{:匹配\textbf命令开头
  • 第一个捕获组({((?:[^{}]++|(?1))*)}):定义成对花括号的匹配规则
    • [^{}]++:占有优先匹配所有非花括号的普通字符,避免无效回溯提升匹配效率
    • (?1):递归调用第一个捕获组的规则,匹配内部嵌套的成对花括号,不会强制要求匹配\textbf前缀
  • 第二个捕获组((?:[^{}]++|(?1))*):直接提取最外层花括号包裹的全部内部内容,就是需要的目标结果
可选可读性更好的命名组写法

如果觉得分组序号不好维护,可以用命名组写法,逻辑完全一致:

pattern = r'''
\\textbf{
(?P<content>
  (?:
    [^{}]+
    |
    (?P<brace>{(?&content)*})
  )*
)
}
'''
result = regex.findall(pattern, cnt, flags=regex.VERBOSE)

内容的提问来源于stack exchange,提问作者rcv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:36:22