我正在编写一个解析器来解析以下输出:
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+)
我能够正确进入管理列。列 Type 包含多个单词,因此我使用了模式
([\w\s+?]+)
希望它能够匹配由一个空格分隔的多个工作,其中 + 是可选的,后跟
(\S+)
来匹配最后一列。我面临的问题是,正则表达式
([\w\s+?]+)
生成多行,它给我一个如下输出
Ethernet4 29,30,31,32 40G 9100 fortyGigE0/4 trunk up up QSFP+ or later off PortChannel0001 N/A
我看到
\s
也与新行匹配。如何限制它不匹配新行?有人可以帮我澄清一下吗。
我查看了这个空格 正则表达式以查找由空格分隔的一个或多个单词 但这也对我没有帮助。有人可以帮助我更好地理解这一点吗?
遇到的问题是
\s
可以匹配任何空白字符,包括换行符。要仅匹配同一行内的空格,请使用
[ \t]
来匹配空格或制表符。
以下是修改后的正则表达式:
(\S+)\s+([\d,]+)\s+(\S+)\s+(\d+)\s+(\S+)\s+(\S+)\s+([up|down])\s+([up|down]+)\s+([\w\s\+]+)\s+(\S+)
解释:
-
(\S+)
:匹配一个或多个非空白字符,捕获到组 1。 -
\s+
:匹配一个或多个空白字符。 -
([\d,]+)
:匹配一个或多个数字或逗号,捕获到组 2。 -
\s+
:匹配一个或多个空白字符。 -
(\S+)
:匹配一个或多个非空白字符,捕获到组 3。 -
\s+
:匹配一个或多个空白字符。 -
(\d+)
:匹配一个或多个数字,捕获到组 4。 -
\s+
:匹配一个或多个空白字符。 -
(\S+)
:匹配一个或多个非空白字符,捕获到组 5。 -
\s+
:匹配一个或多个空白字符。 -
(\S+)
:匹配一个或多个非空白字符,捕获到组 6。 -
\s+
:匹配一个或多个空白字符。 -
([up|down])
:匹配 "up" 或 "down",捕获到组 7。 -
\s+
:匹配一个或多个空白字符。 -
([up|down]+)
:匹配一个或多个 "up" 或 "down",捕获到组 8。 -
\s+
:匹配一个或多个空白字符。 -
([\w\s\+]+)
:匹配一个或多个字母数字字符、空格或加号,捕获到组 9。 这部分已更改以包含空格和加号。 -
\s+
:匹配一个或多个空白字符。 -
(\S+)
:匹配一个或多个非空白字符,捕获到组 10。
通过使用此正则表达式,应该能够在不跨行的情况下匹配所有字段。
标签:python,regex From: 78808725