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

Python正则匹配:如何用单一正则匹配多格式输出行

问题描述

我有如下输出字符串片段:

1b   16 PM1733A_384_SED   S657NE0R400049   MPP94E5Q  12   0    1BF1F72B0  99.9%   0208  Samsung PM1733a 3.84TB 1-WPD-SED

2b   17 PM1733_384_SED    LPNE0M900631     EPK9DE5Q --EMT--    1BF1F72B0   0.0%   0208  Samsung PM1733 3.84TB 1-WPD-SED

1b   18 PM1733A_30T_SED   S6UANE0RB00321   MPP95E5Q --PNP--    DAFA00000   0.0%   0208  Samsung PM1733a 30.72TB 1-WPD-SED  Discovered PNP

2b

我想写一个统一的Python正则表达式匹配前三类有效行(忽略最后仅2b的无效行)。观察到:

  • 第一行第6、7列是12 0
  • 第二行第6列是--EMT--
  • 第三行第6列是--PNP--

我尝试的正则无法覆盖所有情况:

pattern = r'\s+\d\w\s+[0-9A-F]*\s+[A-Z0-9]*_[A-Z0-9]*_[A-Z]*\s+[A-Z0-9]*\s+[A-Z0-9]*\s+[0-9]*\s+[0-9]\s+[A-Z0-9]*\s+[0-9][0-9].[0-9]%\s+[0-9]{4}\s+[A-Za-z]*\s+'
解决方案

可以通过兼容可变列的写法,写出统一匹配三类行的正则,核心是对第6、7列的两种情况做分支处理。优化后的正则如下:

import re

pattern = r'^\d\w\s+\d+\s+[A-Z0-9_]+\s+[A-Z0-9]+\s+[A-Z0-9]+\s+(?:\d+\s+\d+|--[A-Z]+--)\s+[A-F0-9]+\s+\d+\.\d%\s+\d{4}\s+.+'

正则逐段说明

  • ^\d\w:匹配行首的标识(如1b、2b),^确保从行开始匹配
  • \s+\d+:匹配空格分隔的数字列(如16、17)
  • [A-Z0-9_]+:匹配型号字符串(如PM1733A_384_SED)
  • [A-Z0-9]+\s+[A-Z0-9]+:匹配连续两个序列号列(如S657NE0R400049、MPP94E5Q)
  • (?:\d+\s+\d+|--[A-Z]+--):非捕获组,兼容两种情况:要么是两个数字(如12 0),要么是--XXX--格式的标识(如--EMT--、--PNP--)
  • [A-F0-9]+:匹配十六进制字符串(如1BF1F72B0)
  • \d+\.\d%:匹配百分比格式(如99.9%、0.0%)
  • \d{4}:匹配四位数字(如0208)
  • .+:匹配剩余的描述文本,包括可选的Discovered PNP

匹配验证

用以下代码测试,可以精准匹配前三行有效内容:

output = """1b   16 PM1733A_384_SED   S657NE0R400049   MPP94E5Q  12   0    1BF1F72B0  99.9%   0208  Samsung PM1733a 3.84TB 1-WPD-SED

2b   17 PM1733_384_SED    LPNE0M900631     EPK9DE5Q --EMT--    1BF1F72B0   0.0%   0208  Samsung PM1733 3.84TB 1-WPD-SED

1b   18 PM1733A_30T_SED   S6UANE0RB00321   MPP95E5Q --PNP--    DAFA00000   0.0%   0208  Samsung PM1733a 30.72TB 1-WPD-SED  Discovered PNP

2b"""

matches = re.findall(pattern, output, re.MULTILINE)
for match in matches:
    print(match)

输出结果:

1b   16 PM1733A_384_SED   S657NE0R400049   MPP94E5Q  12   0    1BF1F72B0  99.9%   0208  Samsung PM1733a 3.84TB 1-WPD-SED
2b   17 PM1733_384_SED    LPNE0M900631     EPK9DE5Q --EMT--    1BF1F72B0   0.0%   0208  Samsung PM1733 3.84TB 1-WPD-SED
1b   18 PM1733A_30T_SED   S6UANE0RB00321   MPP95E5Q --PNP--    DAFA00000   0.0%   0208  Samsung PM1733a 30.72TB 1-WPD-SED  Discovered PNP

内容的提问来源于stack exchange,提问作者Santhosh Kumar HN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:55:23