正则表达式需求:匹配\editable标签多组内容并忽略特定中间匹配
解决\editable结构的正则匹配问题
问题分析
你需要匹配\editable[xxx]{...}结构,提取方括号内的内容(组1)和花括号内的目标内容(组2),同时要处理花括号内的非转义嵌套结构,并且要能返回所有匹配结果。之前的正则存在两个问题:只能匹配单个结果、无法处理嵌套花括号。
改进后的正则表达式
场景1:花括号内是LaTeX命令(如\textit{xxx})
如果你的目标是提取命令内部{}里的内容,用这个正则:
r"\\editable\[([^\]]+)\]\{\\[a-zA-Z]+\{((?:[^\\{}]|\\.|(?<!\\)\{(?:[^\\{}]|\\.)*?(?<!\\)\})*)\}\}"
场景2:花括号内直接是内容(支持非转义嵌套花括号)
如果{}内没有前置LaTeX命令,直接是带嵌套的内容,用这个正则:
r"\\editable\[([^\]]+)\]\{((?:[^\\{}]|\\.|(?<!\\)\{(?:[^\\{}]|\\.)*?(?<!\\)\})*)\}"
正则规则说明
\\editable:精准匹配固定标识\editable\[([^\]]+)\]:捕获方括号内的内容作为组1,[^\]]+确保只匹配到第一个未转义的]- 组2的匹配逻辑:
[^\\{}]:匹配普通字符(排除\、{、})\\.:匹配转义字符(比如\{、\}这类转义符号)(?<!\\)\{(?:[^\\{}]|\\.)*?(?<!\\)\}:匹配非转义的嵌套花括号,确保内部的{}被完整纳入组2内容
获取所有匹配结果示例
用Python的re.findall()方法可以一次性获取所有匹配的组结果:
import re # 测试文本 text = """ \\editable[blab]{\\textit{anna karenina}} \\editable[test]{\\textbf{war and peace}} \\editable[demo]{\\textit{abc{def}ghi}} """ # 选择对应场景的正则 pattern = r"\\editable\[([^\]]+)\]\{\\[a-zA-Z]+\{((?:[^\\{}]|\\.|(?<!\\)\{(?:[^\\{}]|\\.)*?(?<!\\)\})*)\}\}" matches = re.findall(pattern, text) # 输出所有结果 for idx, (group1, group2) in enumerate(matches, 1): print(f"匹配{idx}:") print(f"组1(方括号内容): {group1}") print(f"组2(目标内容): {group2}\n")
运行输出:
匹配1: 组1(方括号内容): blab 组2(目标内容): anna karenina 匹配2: 组1(方括号内容): test 组2(目标内容): war and peace 匹配3: 组1(方括号内容): demo 组2(目标内容): abc{def}ghi
内容的提问来源于stack exchange,提问作者Komal Rumade
相关产品推荐
相关产品推荐

