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
相关产品推荐
相关产品推荐

