【问题标题】:Pattern Match in pythonpython中的模式匹配
【发布时间】:2022-12-15 13:56:08
【问题描述】:

我给出了输出字符串的 sn-p 如下:

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

我想创建一个匹配上述输出的模式。

如果您在第一行看到列 [6,7],则输出为“12 0”。在第二行中,输出是第 6 列中的“--EMT--”,在第三行中是--PNP--。我能够分别为第一行或第二行/第三行创建模式。但是有没有办法我们可以创建 3 行的模式?

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+'

【问题讨论】:

  • 你确定你需要一个正则表达式吗?看起来使用 string.split 和基于规则的处理会更容易。
  • 另外,您知道您可以为这些列期望哪种值吗?例如,如果 0 是具有 1BF1F72B0 的列的有效值,则结果不明确。
  • 是的,我使用了拆分新行选项并且能够得到这些行。但是从正则表达式中,是否有可能获得这种情况的“模式”?

标签: python regex


【解决方案1】:

如果您想将前 3 行匹配到您的模式仅匹配第一行的部分(没有前导和尾随空白字符):

dws+[dA-F]+s+[A-Zd]+_[A-Zd]+_[A-Z]+s+[A-Zd]+s+[A-Zd]+s+(?:d+s+d+|--[A-Z]+--)s+[A-Z0-9]+s+d+.d%s+d{4}s+[A-Za-z]+

添加的部分匹配:

  • (?:替代方案的非捕获组
    • d+s+d+ 匹配 1+ 个数字、1+ 个空白字符和 1+ 个数字
    • | 或者
    • --[A-Z]+---- 之间匹配 1+ 个字符 A-Z
  • )关闭非捕获组
  • s+匹配 1+ 个空白字符

regex demo

笔记在你的模式中你使用像*这样的量词,在这种情况下它可以匹配零次或多次,所以_[A-Z0-9]*_也允许__匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2018-01-28
    • 2012-08-18
    相关资源
    最近更新 更多