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

Python脚本问题:如何提取两个匹配模式间的多行文本?

问题描述

需要从以下文本中提取FEATURE AAA开头的整段内容(直到行尾不含反斜杠的行):

原始文本:

FEATURE AAA cdslmd 22.02 28-jul-2023 1 \
3F76BA3DA7102935AD12 VENDOR_STRING=J:PERM DUP_GROUP=NONE \
vendor_info=13-jun-2023 \
ISSUER=CDNS2161b9360e2037d6f7bd35a11244661a ISSUED=13-jun-2023 \
EC0C" V7.1_LK=3F06FAFDD30D943EC2DD

FEATURE BBB cdslmd 22.02 28-jul-2023 2 7F061A2D977BFEF08F2F \
VENDOR_STRING=J:PERM DUP_GROUP=NONE vendor_info=13-jun-2023 \
ISSUER=CDNS2161b9360e2037d6f7bd35a11244661a ISSUED=13-jun-2023 \
A843" V7.1_LK=BFC68A9D5606A8296604

预期提取结果:

FEATURE AAA cdslmd 22.02 28-jul-2023 1 \
3F76BA3DA7102935AD12 VENDOR_STRING=J:PERM DUP_GROUP=NONE \
vendor_info=13-jun-2023 \
ISSUER=CDNS2161b9360e2037d6f7bd35a11244661a ISSUED=13-jun-2023 \
EC0C" V7.1_LK=3F06FAFDD30D943EC2DD

现有脚本及问题

编写的Python脚本:

import os
import re

pat1 = r"[A-Z]+.AAA"
pat2 = r"[^\\]$"

with open('all.txt') as f:
    match = False

    for l in f:
        if re.match(pat1, l): 
            match = True
            print(l)
            continue
        if re.search(pat2, l): 
            match = False
            continue
        if match:
            print(l)
f.close()

执行后仅输出首行:

FEATURE AAA cdslmd 22.02 28-jul-2023 1 1F469A0DE7A48BDAE16B \

问题原因

  1. 正则pat1不准确:[A-Z]+.AAA中的.是通配符,会匹配任意单个字符,可能误匹配无关行,且未精确限定开头。
  2. 正则pat2逻辑错误:读取行时默认包含末尾换行符\n,[^\\]$会匹配所有行(因为行尾是\n而非\),导致第一行后直接关闭匹配状态。
  3. 输出格式问题:print(l)会自动追加换行符,导致原始文本的换行逻辑混乱。

修正后的脚本

import re

# 精确匹配以FEATURE AAA开头的行
pat_start = r"^FEATURE AAA"

with open('all.txt') as f:
    is_matching = False
    for line in f:
        stripped_line = line.rstrip('\n')
        # 触发匹配状态
        if re.match(pat_start, line):
            is_matching = True
            print(line, end='')
        # 处于匹配状态时输出行,并检查是否到达结束行
        elif is_matching:
            print(line, end='')
            # 行尾不含反斜杠(去掉换行符后)则关闭匹配
            if not stripped_line.endswith('\\'):
                is_matching = False

说明

  • 用^FEATURE AAA精确匹配目标段的起始行,避免误匹配。
  • 先输出行再判断是否为结束行,确保结束行本身被包含在结果中。
  • 使用print(line, end='')保留原始文本的换行格式,避免重复添加换行符。

内容的提问来源于stack exchange,提问作者Anil Reddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:32:04