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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arrays(操作数组工具类)、Lambda表达式

package exercise;import java.util.Arrays;public class ArraysDemo {public static void main(String[] args) {int[] arr {1, 2, 3, 4, 5};//将数组变成字符串System.out.println(Arrays.toString(arr));//二分查找法查找元素//细节1:1.数组必须是有序的 2.元素…

OpenCASCADE入门(2)——openCasCade7.6.0版本的exe方式安装,vs2017环境配置,编译和使用draw

3rd party Components | Open CASCADE Technology 目录 引出安装好vs2017和occt7.6设置环境变量 启动occt和编译关于custom.bat批处理文件双击运行 打开draw使用方式一:双击draw.bat批处理vs设置启动项 总结其他自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进…

路由器设置——隐藏SSID(隐藏WiFi名称)

参考来源: https://www.192ly.com/qiu-zhu/33315.htmlhttps://www.yunqishi.net/video/109743.html 一、什么是SSID? SSID是Service Set ldentifier的缩写,意思是服务集标识,简单来说SSID就是wifi的名字。 二、怎么隐藏SSID 将 开启SSI…

为什么要学习数据结构和算法

前言 控制专业转码学习记录,本科没学过这门课,但是要从事软件行业通过相关面试笔试基础还是要打牢固的,所以通过写博客记录一下。 必要性 1.越是厉害的公司,越是注重考察数据结构与算法这类基础知识 2.作为业务开发&#xff0c…

MMPose-RTMO推理详解及部署实现(上)

目录 前言1. 概述1.1 MMPopse1.2 MMDeploy1.3 RTMO 2. 环境配置3. Demo测试4. ONNX导出初探5. ONNX导出代码浅析6. 剔除NMS7. 输出合并8. LayerNormalization算子导出9. 动态batch的实现10. 导出修改总结11. 拓展-MMPose中导出ONNX结语下载链接参考 前言 最近在 MMPose 上看到了…

【NOIP2018普及组复赛】题2:龙虎斗

题2:龙虎斗 【题目描述】 轩轩和凯凯正在玩一款叫《龙虎斗》的游戏,游戏的棋盘是一条线段,线段上有 n n n 个兵营(自左至右编号 1 ∼ n 1∼n 1∼n),相邻编号的兵营之间相隔 1 1 1 厘米,即棋…

【Python从入门到进阶】56、Mysql防止SQL注入及ORM库简化操作

接上篇《55、使用Python轻松操作Mysql数据库》 上一篇我们讲解了Mysql的基本链接和增删改查,本篇我们来介绍链接Mysql时参数化查询与防止SQL注入以及使用ORM(对象关系映射)库简化操作的内容。 一、参数化查询与防止SQL注入 在数据库操作中&…

雄鹰只属于天空

雄鹰只属于天空 成大事者,必有人生至暗时刻之经历,高处坠落折戟沉沙,在孤立无援时,世态炎凉人情冷落,饱经苦楚滋味,所有的热情关系一夜冰封,冷嘲热讽袖手旁观,落井下石四面楚歌&…

互联网简史-分久必合,合久必分

六一儿童节,给孩子们讲讲互联网的历史。 任何当代技术都是古老技术的重组,这是真的。我从电话网络开始,两幅图完事。电波可以承载语音作为最开始,后面的事自然而然: 说实话,网络这种事,它的 …

栈-顺序存储链式存储

栈 栈是只允许在一端进行插入或删除操作的线性表。 #mermaid-svg-bQDXWRm3HxvAxVMQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bQDXWRm3HxvAxVMQ .error-icon{fill:#552222;}#mermaid-svg-bQDXWRm3HxvAxVMQ .e…

FPGA中的乒乓操作

为什么不直接选用一个缓存更大的FIFO而选用乒乓操作为什么乒乓操作可以实现低速处理高速数据乒乓操作适用哪些场景 一、乒乓操作结构 首先先介绍一下乒乓操作的原理,其结构如下: 输入选择单元负责将数据送到数据缓冲模块,然后输出选择单元负…

面试题vue+uniapp(个人理解-面试口头答述)未编辑完整....

1.vue2和vue3的区别(vue3与vue2的区别(你不知道细节全在这)_vue2和vue3区别-CSDN博客)参考 Vue3 在组合式(Composition )API,中使用生命周期钩子时需要先引入,而 Vue2 在选项API&am…

使用迭代最近点 (ICP) 算法在 Open3D 中对齐点云

一、Open3D 简介及其功能 Open3D 是一个现代库,它提供了用于处理 3D 数据的各种工具。在其功能中,它提供了高效的数据结构和算法来处理点云、网格等,使其成为在计算机视觉、机器人和图形领域工作的研究人员和从业人员的不错选择。Open3D 的特…

2023 N1CTF Junior pwn 顶级签到

文章目录 参考make_pairstring_view和stringstd::string 的内部实现和特点std::string_view 的内部实现和特点例子说明 SSO(Short String Optimization)和堆分配源码思路exp 参考 https://zqy.ink/2023/05/12/dingjiqiandao/ make_pair 该函数的作用是解析用户输入的登录信息…

力扣--最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出:…

头歌处理机调度与死锁--银行家算法第1关:安全性检查

测试说明 平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 输入格式说明: 第1行是系统的进程数N 第2行是系统的资源类别数M 第3行是系统的资源总数,一共有M个数值,每个数值是一类资源的总数。 第4行开始一共有N行,…

2024 年最新安装MAC-vue教学包括常见错误

花了一上午时间终于将 vue 的工程文件安装好了,本教材是傻瓜式操作,按着教程一步一步操作最后就可以看到页面了。 安装Node 1.在线地址: https://nodejs.org/en 2、点击 Download Node.js下载即可,下载完成后,傻瓜式的…

primeflex Display盒模型显示相关样式实战案例

01 Display盒子模式相关样式 基础样式 ClassPropertieshiddendisplay: none;blockdisplay: block;inlinedisplay: inline;inline-blockdisplay: inline-block;flexdisplay: flex;inline-flexdisplay: inline-flex; 样式说明: hidden:隐藏&#xff0c…

c# 学习教程

打印语句 折叠代码 变量 整形 浮点型 特殊类型

林业调查具体是做些什么?

林业调查是对森林资源进行系统的信息收集和处理的过程。 林业调查涵盖了对林木、林地以及林区内生长的动植物及其环境条件的全面评估,旨在及时掌握森林资源的数量、质量和生长消亡的动态规律。这种调查不仅关注森林本身,还包括与之相关的自然环境和经济…