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

Python文件解析:匹配双模式时输出前后指定行数的方法

实现可配置前后行数的文件内容提取

需求说明

假设目标文件内容如下:

line1
line2
line3
line4
line5
line6
line7
line8
line9
line10
line11
line12
line13
line14
line15

需要提取line6和line9之间的内容,同时包含起始模式前2行和结束模式后2行,期望输出:

line4
line5
line6
line7
line8
line9
line10
line11

现有代码仅能提取两个模式之间的内容:

first_pattern = "line6"
last_pattern = "line9"

with open(file, "r") as f:
    inside_region = False
    for line in f:
        if first_pattern in line:
            inside_region = True
        if inside_region:
            print(line)  # Printing the lines between two patterns
        if last_pattern in line:
            inside_region = False
            break

修改后的实现代码

我们可以用滑动窗口缓冲区保存最近的指定行数,同时跟踪输出状态,实现可配置的前后行数扩展:

from collections import deque

first_pattern = "line6"
last_pattern = "line9"
lines_before_after = 2  # 可配置的前后扩展行数
file_path = "your_file.txt"  # 替换为你的实际文件路径

with open(file_path, "r") as f:
    # 用deque维护固定长度的滑动窗口,自动丢弃超出长度的最早行
    pre_buffer = deque(maxlen=lines_before_after)
    inside_region = False
    post_remaining = 0

    for line in f:
        line = line.rstrip('\n')  # 可选:去除换行符,避免重复输出空行
        
        if not inside_region:
            pre_buffer.append(line)
            # 匹配到起始模式时,切换状态并输出前置缓冲区内容
            if first_pattern in line:
                inside_region = True
                for buf_line in pre_buffer:
                    print(buf_line)
        else:
            # 处于目标区域内,直接输出当前行
            print(line)
            # 匹配到结束模式时,开启后置行数计数
            if last_pattern in line:
                post_remaining = lines_before_after
                inside_region = False
        # 处理结束模式后的指定行数输出
        if post_remaining > 0:
            print(line)
            post_remaining -= 1
            # 输出完后置行数后终止遍历
            if post_remaining == 0:
                break

代码说明

  • 前置缓冲区:通过deque的固定长度特性,自动维护最近的lines_before_after行,找到起始模式时一次性输出这些前置内容。
  • 状态切换:用inside_region标记是否处于两个模式之间的核心区域,处于该区域时直接输出每行内容。
  • 后置行数控制:匹配到结束模式后,通过post_remaining计数,继续输出后续指定行数的内容,完成后立即停止文件遍历,提升大文件处理效率。
  • 灵活配置:只需修改lines_before_after的数值,即可快速调整前后扩展的行数,适配不同场景需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:44:48