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

如何批量替换列表中环境变量的符号格式?

需求与解决方案

问题描述

需要处理一个动态变化的列表,列表元素可能包含Windows风格环境变量(带%符号),例如:

a = ['C:\\Temp\\Folder1',
 'C:\\Temp\\Folder2',
 'C:\\Temp\\Folder3',
 'C:\\Temp\\Folder4',
 '%ALLUSERSPROFILE%\\Temp',
 '%WINDIR%\\Temp']

要求将所有带%的元素转换为${小写变量名}格式,处理后结果如下:

a = ['C:\\Temp\\Folder1',
 'C:\\Temp\\Folder2',
 'C:\\Temp\\Folder3',
 'C:\\Temp\\Folder4',
 '${allusersprofile}\\Temp',
 '${windir}\\Temp']

需确保所有符合条件的元素都被处理,同时要给每个路径末尾添加反斜杠以适配API要求。

代码迭代过程

编辑1:初次尝试(未达预期)

最初尝试使用正则替换,但未正确更新列表元素,导致替换无效。代码片段如下:

# 导入模块
import requests, json, os, re

# 用于识别文件夹例外的正则模式
var_pattern = re.compile(r"%([^%]+)%")

# 替换环境变量中%符号的函数
def process_var_sub(match):
    var_name = match.group(1)
    return "${" + var_name.lower() + "}"

# 写入文件夹例外的函数
def write_folder_exception_list(excluded_folder_list, policy_name, section):
    if len(excluded_folder_list):
        for p in excluded_folder_list:
            # 此处错误:正则替换返回新字符串,但未赋值回列表
            var_pattern.sub(process_var_sub, p)
        for i in range(len(excluded_folder_list)):
             excluded_folder_list[i] = excluded_folder_list[i] + "\\"
        excluded_folder_list = {
            'name': policy_name + " "+section+" Exclusions",
            'description': "",
            'items': excluded_folder_list
        }
        payload = json.dumps(excluded_folder_list, indent=4)
        print(payload)
        url = baseurl + "directorylists"
        response = requests.request("POST", url, headers=headers, data=payload)
        print(response.text)
        del response
        del url
        del excluded_folder_list
        del payload
    else:
        return

核心问题:var_pattern.sub()返回替换后的新字符串,但没有将结果赋值回原列表,导致替换操作未生效。

编辑2:临时解决方案

通过列表推导式生成替换后的新列表,实现了功能,但存在循环冗余问题:

def write_folder_exception_list(excluded_folder_list, policy_name, section):
    if len(excluded_folder_list):
        for i in range(len(excluded_folder_list)):
            # 每次循环都重新生成整个替换后的列表,冗余低效
            excluded_folder_list_cleaned = [
                var_pattern.sub(process_var_sub, p)
                for p in excluded_folder_list
            ]
            excluded_folder_list = excluded_folder_list_cleaned
            excluded_folder_list[i] = excluded_folder_list[i] + "\\"
        excluded_folder_list = {
            'name': policy_name + " "+section+" Exclusions",
            'description': "",
            'items': excluded_folder_list_cleaned
        }
        payload = json.dumps(excluded_folder_list, indent=4)
        print(payload)

核心问题:循环内重复生成替换后的列表,造成不必要的性能损耗。

编辑3:优化后的完整实现

结合建议优化代码,将替换和添加反斜杠合并到一次列表推导中,同时完善了从JSON文件读取配置、调用API提交的完整流程:

# 用于识别文件夹例外的正则模式
var_pattern = re.compile(r"%([^%]+)%")

# 替换Apex One环境变量中%符号的函数
def process_var_sub(match):
    var_name = match.group(1)
    return "${" + var_name.lower() + "}"

# 从JSON文件中填充元素
def populate_elements(policy_filename):
    with open(policy_filename) as jsonFile:  # 打开JSON文件
        data = json.load(jsonFile)  # 读取文件内容
        policyname = data['policy'][0]['policyName']  # 获取Apex One中显示的策略名称
        dictionary = data['policy'][0]['managedSettings']  # 读取存储用户自定义数据的managedSettings段
        settings = json.loads(dictionary)  # 将settings作为独立JSON字符串读取
    return policyname, [settings]

# 使用API写入文件夹例外的函数
def write_folder_exception_list(excluded_folder_list, policy_name, section):
    if len(excluded_folder_list):
        # 一次完成替换和添加反斜杠,避免冗余循环
        cleaned_list = [
            var_pattern.sub(process_var_sub, path) + "\\"
            for path in excluded_folder_list
        ]
        excluded_folder_list = {
            'name': f"{policy_name} {section} Exclusions",
            'description': "",
            'items': cleaned_list
        }
        payload = json.dumps(excluded_folder_list, indent=4)
        url = baseurl + "directorylists"
        response = requests.request("POST", url, headers=headers, data=payload)
        print(response.text)
    else:
        return

# 打开脚本运行目录下的JSON策略文件
for file in os.listdir():   # 获取目录中的文件列表
    policy_filename = os.fsdecode(file)    # 获取文件名
    if policy_filename.endswith(".policy"):  # 仅处理.policy文件
        policyName, settings = populate_elements(policy_filename) # 调用函数填充managed_settings信息
        for settings in settings:    # 遍历settings以填充字段
            # RTS排除项
            RTSExcludedFolders = settings["managed_settings"][0]["settings"][1]["value"]['ExcludedFolder']
            RTSExcludedFiles = settings["managed_settings"][0]["settings"][3]["value"]['ExcludedFile']
            RTSExcludedExtensions = settings["managed_settings"][0]["settings"][5]["value"]['ExcludedExt']
            write_folder_exception_list(RTSExcludedFolders, policyName, "RTS Scan")
            write_extensions_exception_list(RTSExcludedExtensions, policyName, "RTS Scan")
            write_filename_exception_list(RTSExcludedFiles, policyName, "RTS Scan")

优化点:

  • 将替换和添加反斜杠合并为一次列表推导,避免重复遍历,提升执行效率
  • 使用f-string简化字符串拼接,代码更易读
  • 移除不必要的手动变量删除操作,Python会自动管理内存回收

内容的提问来源于stack exchange,提问作者OverSeer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:57:05