当前位置: 首页 > news >正文

python替换“${}“占位符为变量,实现读取配置文件

文章目录

  • 背景
  • 1、定义正则表达式
  • 2、替换变量占位符
  • 3、实现功能

背景

使用python编写小工具,有一个配置文件,希望实现类似shell命令的,定义变量并且使用${}或者$来引用。如果有好的建议欢迎讨论。

配置文件示例内容如下:


D:\project\test\properties.txtip=192.168.1.66
user=xiaoshuai
password=123456login_url=https://${ip}/index.php/user=$user?password=$password?name=${user}

总体思路如下:

  1. 读取文件,存储出现的变量
  2. 将存在占位符的变量,使用已读取的变量替换。如果找不到则不替换。

1、定义正则表达式

首先先需要将替换的代码写好,这里直接使用正则表达式替换占位符,然后使用变量进行替换。

# 定义正则表达式
pattern = re.compile(r'\$\{(\w+)}|\$(\w+)')

这个表达式包含可以匹配用${}或者$形式的占位符,且有两个捕获组,用以获取占位符中实际的变量。

2、替换变量占位符

需要替换的字符串如下:

string = r"https://${ip}/index.php/user=$user?password=$password?name=${user}"

这里可以使用正则表达式sub()函数进行替换

# 使用正则表达式进行替换
result = pattern.sub(replace, string)

replace可以是具体的替换字符串,也可以是自定义函数。因为这里需要根据占位符的实际内容来获取不同的变量值,所以需要使用自定义的函数:

# 替换占位符的回调函数
def replace(match):var_name = match.group(1) if match.group(1) else match.group(2)return str(param_dict.get(var_name, match.group()))

replace 函数首先检查第一个捕获组,如果存在则使用它,否则使用第二个捕获组。这样就可以处理 ${variable}$variable 形式的占位符了。

当然也可以使用lambda匿名函数一行处理,那么sub的写法则为:

result = pattern.sub(lambda x: str(param_dict.get(x.group(1) if x.group(1) else x.group(2), x.group())), string)

3、实现功能

读取文件、存储变量、替换占位符和变量

import repath = r'D:\project\test\properties.txt'var_dict = dict()
# 定义正则表达式
pattern = re.compile(r'\$\{(\w+)}|\$(\w+)')with open(path, 'r') as file:for line in file:line = line.replace('\n', '').strip()if not line:continue# 获取配置项key = line.split('=')[0].strip()value = line.replace(key, '', 1).replace('=', '', 1).strip()# 将value中的通配符替换为实际的值value = pattern.sub(lambda x: str(var_dict.get(x.group(1) if x.group(1) else x.group(2), x.group())), value)var_dict[key] = valuefor k, v in var_dict.items():print(f"{k}\t{v}")

结果如下:

image-20240530125209474

相关文章:

  • MiniQMT国债逆回购策略Python代码全解析
  • CSAPP Lab05——Performance Lab完成思路
  • GPT-4o:重塑人机交互的未来
  • 上位机图像处理和嵌入式模块部署(f407 mcu中fatfs中间件使用)
  • npm安装依赖报错npm ERR! code ENOTFOUNDnpm ERR! syscall getaddrinfo
  • static修饰变量和函数
  • Ubuntu中安装和配置SSH的完全指南
  • LeetCode 算法:三数之和c++
  • Java中的泛型类型参数详解
  • 代碼隨想录 day22|day23
  • 7EPhone云手机各功能详解
  • Java 面试题:Java 的动态代理是基于什么原理?
  • js文件 .mjs和.umd.js结尾的文件的区别
  • 【光伏预测】基于BP神经网络实现光伏发电功率预测附Matlab代码
  • Spring Cloud Gateway 集成 Nacos、Knife4j
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • golang中接口赋值与方法集
  • IndexedDB
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • js学习笔记
  • Linux各目录及每个目录的详细介绍
  • NSTimer学习笔记
  • react-native 安卓真机环境搭建
  • Vue小说阅读器(仿追书神器)
  • 规范化安全开发 KOA 手脚架
  • 后端_MYSQL
  • 数组的操作
  • 线上 python http server profile 实践
  • 智能合约Solidity教程-事件和日志(一)
  • ​Redis 实现计数器和限速器的
  • #define、const、typedef的差别
  • #if #elif #endif
  • #vue3 实现前端下载excel文件模板功能
  • (poj1.2.1)1970(筛选法模拟)
  • (二)测试工具
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)创业的注意事项
  • *** 2003
  • ***通过什么方式***网吧
  • .NET Framework .NET Core与 .NET 的区别
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net 使用ajax控件后如何调用前端脚本
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net6 webapi log4net完整配置使用流程
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [1525]字符统计2 (哈希)SDUT
  • [2016.7 test.5] T1
  • [202209]mysql8.0 双主集群搭建 亲测可用