Python批量DN文件解析器输出异常问题排查
问题排查与解决办法
咱们一步步拆解你代码里导致输出异常的核心问题,再给出针对性的修复方案:
1. re.findall返回列表导致输出格式混乱
你用re.findall提取DN和MAC时,它返回的是匹配结果的列表(哪怕只有一个匹配项)。所以dnlist和maclist里的元素都是嵌套列表,比如['1234567890']和['mac:aa:bb:cc:dd:ee:ff'],打印时就会显示成列表格式,这显然不是你想要的效果。
2. 配对逻辑存在严谨性问题
当前代码是把所有含@ttml的DN全收集到一个列表,所有含svc:1的MAC全收集到另一个列表,再用zip强行配对。但如果文件里@ttml和svc:1的行不是严格一一对应(比如某条DN没有对应的MAC,或者反过来),zip会直接截断到较短的列表长度,导致配对完全错误。正确的逻辑应该是找到一个DN后,关联它对应的MAC(比如两行属于同一设备条目)。
3. MAC地址的正则表达式有错误
你写的正则里出现了[a-fA-AF0-9],这里的A-A是无效的字符范围,应该统一写成[a-fA-F0-9]。另外,重复写六次[:][a-fA-F0-9]{2}太冗余,可以简化成更简洁的格式。
修复后的代码
下面是针对这些问题的优化版本,同时调整了配对逻辑:
import re # 预编译正则提升效率,修正并简化匹配规则 dn_pattern = re.compile(r'\d{10}') # 简化MAC匹配:匹配mac:开头的标准MAC格式 mac_pattern = re.compile(r'mac:(?:[a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}') current_dn = None matched_pairs = [] with open('bulkdn.txt', 'r') as f: # 跳过表头行(如果不需要可以删除这行) next(f) for line in f: line = line.strip() if not line: continue # 跳过空行,避免无效处理 if '@ttml' in line: # 用search直接获取单个匹配项,避免列表嵌套 dn_match = dn_pattern.search(line) if dn_match: current_dn = dn_match.group() elif 'svc:1' in line and current_dn is not None: # 找到对应MAC后,和当前DN配对 mac_match = mac_pattern.search(line) if mac_match: # 可选:去掉mac:前缀,让输出更干净 clean_mac = mac_match.group().replace('mac:', '') matched_pairs.append((current_dn, clean_mac)) current_dn = None # 重置,准备下一组配对 # 输出最终配对结果 for idx, (dn, mac) in enumerate(matched_pairs): print(f'{idx} {dn} {mac}')
修复说明
- 正则优化:用
re.compile预编译正则提升效率,修正了MAC正则的字符范围错误,同时简化了重复片段的写法;用search代替findall直接获取单个匹配项,避免嵌套列表。 - 配对逻辑修正:用
current_dn缓存当前找到的DN,直到找到对应的svc:1行的MAC,再将两者配对存入结果列表,确保DN和MAC是正确关联的。 - 冗余内容处理:添加了跳过表头行和空行的逻辑,避免无效行干扰匹配。
- 输出优化:用
enumerate替代手动维护i变量,同时可选去除MAC的mac:前缀,让输出更符合预期。
内容的提问来源于stack exchange,提问作者Anna Patil
相关产品推荐
相关产品推荐

