You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:33:29