Python解析txt防火墙配置存为字典列表的代码问题排查
防火墙规则解析代码修复方案
原代码核心问题汇总
- 基础语法/变量错误:结果列表定义名为
final_list,追加时错写为final;pattern_headers列表缺失逗号导致两个字段名拼接为一个字符串,和正则列表长度不匹配发生错位;定义了解析函数但未调用,根本不会执行解析逻辑。 - 文件读取逻辑错误:先调用一次
readline()读取首行,进入循环后立刻再次读取下一行,直接跳过第一行配置内容。 - 多值处理缺失:同一字段出现多个值时直接覆盖旧值,无法生成要求的列表格式。
- 判断逻辑错误:动作结束分支的判断条件恒为真,永远不会执行字典追加、重置操作,是结果列表为空的核心原因之一。
- 字段名不匹配:代码中定义的键名和需求要求的输出键名不一致;正则表达式用模糊通配符容易出现跨字段误匹配。
修复后完整代码
import re data_file = "sample_data.txt" ##### 正则匹配规则 ##### filter_re = r'(?<=filter )\S+(?= term)' term_re = r'(?<=term )\S+(?= from| then)' protocol_re = r'(?<=protocol )\S+' dest_port_re = r'(?<=destination-port )\S+' source_port_re = r'(?<=from source-port )\S+' prefix_source_re = r'(?<=from source-prefix-list )\S+' prefix_dest_re = r'(?<=from destination-prefix-list )\S+' source_addr_re = r'(?<=source-address )\S+' dest_addr_re = r'(?<=destination-address )\S+' action_re = r'(?<=then )(deny|accept)' # 正则和输出字段名一一对应,顺序必须和pattern_list对齐 pattern_list = [ filter_re, term_re, source_addr_re, prefix_source_re, source_port_re, dest_addr_re, prefix_dest_re, dest_port_re, protocol_re, action_re ] pattern_headers = [ "Filter", "Term", "SourceIP", "SourcePrefixList", "SourcePort", "DestinationIP", "DestinationList", "DestinationPort", "Protocol", "Action" ] final_list = [] def parse_firewall_file(file): rule_dict = {} with open(file, 'r') as f: # 直接迭代文件对象逐行读取,不会跳过首行 for line in f: line = line.strip() if not line: continue for header, pattern in zip(pattern_headers, pattern_list): match = re.findall(pattern, line) if not match: continue value = match[0] # 匹配到动作字段,说明当前规则结束 if header == "Action": rule_dict[header] = value # 追加字典副本避免可变对象引用复用问题 final_list.append(rule_dict.copy()) rule_dict = {} else: # 处理多值场景:同字段多次出现自动转列表 if header not in rule_dict: rule_dict[header] = value else: # 已有值时判断类型,统一转为列表追加 if isinstance(rule_dict[header], list): rule_dict[header].append(value) else: rule_dict[header] = [rule_dict[header], value] return final_list # 调用函数执行解析 if __name__ == "__main__": result = parse_firewall_file(data_file) print(result)
关键修复点说明
- 多值自动适配:同一字段第一次出现存为字符串,第二次及以后出现自动转为列表存储,完全匹配需求要求的输出格式,单值不强行套列表。
- 规则结束判定:匹配到
accept/deny动作时,先存入动作字段,再把当前规则字典的副本追加到结果列表,立刻重置空字典,解决字典引用复用导致历史数据被最后一条规则覆盖的问题。 - 正则优化:把原来的贪婪匹配、通配符匹配改成精确匹配非空连续字符,不会出现跨行、跨字段误匹配的问题。
- 无多余字段:只有配置中实际存在的属性才会生成键值对,不存在的属性不会出现在结果字典里。
内容的提问来源于stack exchange,提问作者gollyimgully
相关产品推荐
相关产品推荐

