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 \
问题原因
- 正则
pat1不准确:[A-Z]+.AAA中的.是通配符,会匹配任意单个字符,可能误匹配无关行,且未精确限定开头。 - 正则
pat2逻辑错误:读取行时默认包含末尾换行符\n,[^\\]$会匹配所有行(因为行尾是\n而非\),导致第一行后直接关闭匹配状态。 - 输出格式问题:
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
相关产品推荐
相关产品推荐

