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

Python删除txt内固定起止proof块的正则代码修复

原正则失效原因

你最初写的", proof{.*?}"存在两个核心缺陷,无法匹配目标内容:

  • 默认正则规则下,通配符.不会匹配换行符,跨行的proof块内容会直接被跳过,匹配范围只能覆盖单行内容
  • 非贪婪匹配.*?遇到第一个}就会终止匹配,完全无法处理proof块内部嵌套大括号的场景,会出现匹配截断、错位的问题
修正方案

由于需要匹配配对嵌套的大括号,Python内置re模块不支持递归匹配结构,可根据需求选择以下两种实现方案:

方案1:使用支持递归匹配的regex库(代码最简洁)

先安装第三方正则库,它原生支持递归匹配语法,可以直接识别配对的大括号结构:

  1. 执行安装命令:pip install regex
  2. 实现代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:06:12