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

Python正则匹配单行多字段(含多词列)避免跨行的问题求助

问题描述

我正在编写解析器以解析以下网络设备接口状态输出:

admin@str-s6000-on-5:~$ show interface status Ethernet4
      Interface        Lanes    Speed    MTU         Alias    Vlan    Oper    Admin            Type    Asym PFC
---------------  -----------  -------  -----  ------------  ------  ------  -------  --------------  ----------
      Ethernet4  29,30,31,32      40G   9100  fortyGigE0/4   trunk      up       up  QSFP+ or later         off
PortChannel0001          N/A      40G   9100           N/A  routed      up       up             N/A         N/A
PortChannel0002          N/A      40G   9100           N/A  routed      up       up             N/A         N/A
PortChannel0003          N/A      40G   9100           N/A  routed      up       up             N/A         N/A
PortChannel0004          N/A      40G   9100           N/A  routed      up       up             N/A         N/A

我尝试编写了如下正则表达式匹配所有字段:

(\S+)\s+([\d,]+)\s+(\S+)\s+(\d+)\s+(\S+)\s+(\S+)\s+([up|down])+\s+([up|down]+)\s+([\w\s+?]+)\s+(\S+)

Admin列之前的字段匹配正常,但Type列包含多个单词,我使用([\w\s+?]+)模式希望匹配由单个空格分隔的多词(+为可选),后续用(\S+)匹配最后一列。但该模式会跨行匹配,得到错误输出:Ethernet4 29,30,31,32 40G 9100 fortyGigE0/4 trunk up up QSFP+ or later off PortChannel0001 N/A 。我发现\s会匹配换行符,请问如何限制其不匹配换行符?

解决方案

核心问题是\s会匹配任意空白字符(包括换行符),要解决跨行匹配问题,可通过以下两种方案调整正则:

方案1:用明确空白字符集替代\s

将正则中的\s替换为[ \t](仅匹配空格和制表符,不包含换行),同时优化匹配规则适配全量数据:

^(\S+)\s+([\d,]+|N/A)\s+(\S+)\s+(\d+)\s+(\S+|N/A)\s+(\S+)\s+(up|down)\s+(up|down)\s+([\w+?\s]+?)\s+(\S+|N/A)$
  • 用^和$锚定每行首尾,确保仅匹配单行内容
  • 调整[\d,]+为[\d,]+|N/A,适配PortChannel行的Lanes列值
  • Type列使用非贪婪模式[\w+?\s]+?,避免过度匹配吃掉后续空格和最后一列内容
  • 最后一列添加|N/A,适配PortChannel行的Asym PFC值
  • 修正原正则错误:将([up|down])+改为(up|down),正确匹配完整的状态值

方案2:限制正则引擎的空白匹配范围

部分正则引擎支持通过修饰符或自定义字符集,让\s仅匹配非换行空白。但方案1的明确字符集写法兼容性更强,无需依赖引擎特性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:54:50