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
相关产品推荐
相关产品推荐

