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注入 在数据库操作中&…

雄鹰只属于天空

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

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

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

FPGA中的乒乓操作

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

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

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

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

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

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# 学习教程

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

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

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

企业级win10电脑下同时存在Python3.11.7Python3.6.6,其中Python3.6.6是后装的【过程与踩坑复盘】

背景: 需要迁移原始服务器的上的Python3.6.6Flask项目到一个新服务器上, 新服务器上本身存在一个Python3.11.7, 所以这涉及到了一个电脑需要装多个Python版本的问题 过程: 1-确定新电脑版本【比如是32还是64位】 前面开发人员存留了两个…

算法练习第26天|46.全排列、47全排列II

46.全排列 46. 全排列 - 力扣(LeetCode)https://leetcode.cn/problems/permutations/description/ 题目描述: 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1:…

STM32 | 超声波实战

​01、上节回顾 STM32 | HC-SR04 超声波测距模块 | DHT11数字温湿度传感器(第七天)STM32 | 数字温湿度传感器DHT11STM32 | HC-SR04 超声波测距模块STM32 | DHT11数字温湿度传感器实战02、超声波图示 03、超声波头文件 #ifndef __SR04_H#define __SR04_H​#include "stm…

在鸿蒙中身份校验的手势密码的实现

在harmony中它提供了默认的组件PatternLock(); 这个就能直接显示九宫格密码验证 并且他有两个主要的回调事件 .onDotConnect密码输入选中宫格圆点时触发该回调 .onPatternComplete:密码输入结束时触发该回调 //如代码实现 PatternLock().sideLength(32…