使用ciscoconfparse解析WLAN控制器配置中两种格式VLAN ID的问题
兼容单行/跨行格式的WLAN控制器VLAN ID提取方案
根因说明
现有代码失效的核心原因是CiscoConfParse默认按独立行解析配置,跨两行的VLAN配置中,第二行的ID不会被识别为VLAN对象的内置内容。
实现方案
方案1:预处理配置后解析(推荐)
先合并断行的VLAN配置为统一的单行格式,后续所有配置解析逻辑都可以复用原有逻辑,不会出现同类断行问题。
完整代码如下:
from ciscoconfparse import CiscoConfParse import re # 预处理配置,合并VLAN相关断行 processed_lines = [] with open('config.txt', 'r', encoding='utf-8') as f: lines = f.readlines() skip_next = False for idx, line in enumerate(lines): if skip_next: skip_next = False continue # 匹配VLAN开头、仅含点无数字的断行首行 if re.match(r'^VLAN\.+\s*$', line.rstrip('\n')): # 提取下一行的VLAN ID,合并为单行 next_line = lines[idx+1].strip() vlan_id = re.search(r'\d+', next_line).group() processed_lines.append(f"VLAN............................................. {vlan_id}\n") skip_next = True else: processed_lines.append(line) # 解析处理后的配置 parse = CiscoConfParse(processed_lines, syntax='ios') vlan_line = parse.find_objects(r'^VLAN')[0] vlan_id = re.search(r'\d+', vlan_line.text).group() print(f" VLAN: {vlan_id}")
方案2:最小改动适配原有逻辑
不需要修改原始配置,直接在原有代码基础上增加下一行判断逻辑即可:
from ciscoconfparse import CiscoConfParse import re parse = CiscoConfParse('config.txt', syntax='ios') vlan_obj = parse.find_objects(r'^VLAN')[0] # 先尝试从当前行提取ID id_match = re.search(r'\d+', vlan_obj.text) if id_match: vlan_id = id_match.group() else: # 当前行无ID则从下一行提取 next_line = vlan_obj.next_line.text vlan_id = re.search(r'\d+', next_line).group() print(f" VLAN: {vlan_id}")
内容的提问来源于stack exchange,提问作者Richard Lucht
相关产品推荐
相关产品推荐

