Python删除txt内固定起止proof块的正则代码修复
原正则失效原因
你最初写的", proof{.*?}"存在两个核心缺陷,无法匹配目标内容:
- 默认正则规则下,通配符
.不会匹配换行符,跨行的proof块内容会直接被跳过,匹配范围只能覆盖单行内容 - 非贪婪匹配
.*?遇到第一个}就会终止匹配,完全无法处理proof块内部嵌套大括号的场景,会出现匹配截断、错位的问题
修正方案
由于需要匹配配对嵌套的大括号,Python内置re模块不支持递归匹配结构,可根据需求选择以下两种实现方案:
方案1:使用支持递归匹配的regex库(代码最简洁)
先安装第三方正则库,它原生支持递归匹配语法,可以直接识别配对的大括号结构:
- 执行安装命令:
pip install regex - 实现代码:
import regex # 读取原始日志文件,指定utf-8编码避免特殊逻辑符号乱码 with open("p2.txt", "r", encoding="utf-8") as f: raw_content = f.read() # 正则说明:匹配", proof{"开头,支持任意层级嵌套大括号,直到匹配到对应闭合的} # (?R)表示递归匹配整个括号内的模式,可覆盖跨行、内部带大括号的所有proof块 match_pattern = r", proof\{(?:[^{}]|(?R))*\}" cleaned_content = regex.sub(match_pattern, "", raw_content) # 写入精简后的日志文件 with open("p2_red.txt", "w", encoding="utf-8") as f: f.write(cleaned_content)
方案2:手动实现括号计数逻辑(无需安装第三方依赖)
如果不想额外安装库,可以通过遍历字符串、计数大括号层级的方式精准定位proof块的首尾边界:
def remove_proof_blocks(content: str) -> str: result_parts = [] cur_pos = 0 block_start_tag = ", proof{" tag_length = len(block_start_tag) total_length = len(content) while cur_pos < total_length: # 查找下一个proof块的起始位置 start_pos = content.find(block_start_tag, cur_pos) if start_pos == -1: # 无剩余proof块,拼接剩余内容后退出 result_parts.append(content[cur_pos:]) break # 先拼接proof块之前的正常日志内容 result_parts.append(content[cur_pos:start_pos]) # 从proof块的第一个{开始做括号层级计数 brace_level = 1 scan_pos = start_pos + tag_length while scan_pos < total_length and brace_level > 0: if content[scan_pos] == "{": brace_level += 1 elif content[scan_pos] == "}": brace_level -= 1 scan_pos += 1 # 游标跳过整个proof块,从闭合}之后继续扫描 cur_pos = scan_pos return "".join(result_parts) # 调用示例 with open("p2.txt", "r", encoding="utf-8") as f: raw = f.read() cleaned = remove_proof_blocks(raw) with open("p2_red.txt", "w", encoding="utf-8") as f: f.write(cleaned)
注意事项
- 读写文件时必须指定和原文件一致的字符编码,避免∨、→、⊢这类特殊逻辑符号出现乱码
- 两种方案都可以正确处理跨行、内部包含任意层级嵌套大括号的proof块,不会出现提前截断、匹配错位的问题
- 处理过程不会修改proof块之外的所有日志内容、参数、特殊符号,完全保留原有非proof块的内容格式
内容的提问来源于stack exchange,提问作者Martin Kunze
相关产品推荐
相关产品推荐

