如何编写匹配show vlan输出的Python正则表达式?
解决show vlan输出的VLAN与端口提取问题
嘿,我来帮你搞定这个正则匹配的麻烦!你之前写的正则逻辑太零散,没法把VLAN号和对应的端口关联起来,自然得不到想要的结果。咱们一步步来修正:
问题分析
你的原始输出里,每个VLAN对应的端口是在同一行里的,比如1 inside up Et0/1, Et0/3, Et0/4, Et...,而你的正则是两个独立的分支,一个匹配VLAN开头部分,一个匹配端口,这就导致VLAN和端口没法对应,还处理不了一行里多个端口的情况。
正确解决方案
我们可以分两步处理:先抓取每个VLAN行里的VLAN号和端口列表字符串,再拆分端口列表,把每个端口和对应的VLAN号组合起来。
Python代码实现
import re # 替换成你实际读取的文件内容 raw_output = """asa# Show switch vlan VLAN Name Status Ports ---- -------------------------------- --------- ----------------------------- 1 inside up Et0/1, Et0/3, Et0/4, Et0/5, Et0/6, Et0/7 2 guest up Et0/0 3 dmz up Et0/2""" # 匹配每行的VLAN号和端口列表 vlan_port_regex = re.compile(r'^(\d+)\s+\S+\s+\S+\s+(.+)$', re.MULTILINE) match_results = vlan_port_regex.finditer(raw_output) final_output = [] for match in match_results: vlan_id = match.group(1) ports_raw = match.group(2) # 拆分端口,过滤掉省略号和空内容 ports = [p.strip() for p in ports_raw.split(',') if p.strip() and not p.strip().startswith('Et...')] # 组合VLAN和端口 for port in ports: final_output.append(f"Vlan {vlan_id} {port}") # 输出期望格式的结果 print(' '.join(final_output))
代码说明
re.MULTILINE参数让正则的^匹配每一行的开头,这样能准确抓取每个VLAN的行;- 正则
^(\d+)\s+\S+\s+\S+\s+(.+)$:(\d+):精准抓取VLAN号;\s+\S+\s+\S+:跳过VLAN名称和状态这两列(都是非空白字符,中间用空格分隔);(.+):抓取该行所有的端口内容;
- 拆分端口列表时,处理了逗号分隔、空格,还过滤了原始输出里可能存在的省略号(比如
Et...); - 最后把每个端口和对应VLAN号组合成你想要的格式。
运行这段代码后,输出结果完全符合你的期望:Vlan 1 Et0/1 Vlan 1 Et0/3 Vlan 1 Et0/4 Vlan 1 Et0/5 Vlan 1 Et0/6 Vlan 1 Et0/7 Vlan 2 Et0/0 Vlan 3 Et0/2
内容的提问来源于stack exchange,提问作者Beano
相关产品推荐
相关产品推荐

