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/news/846886.shtml

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

相关文章

IGraph使用实例——线性代数计算(blas)

1 概述 在图论中,BLAS(Basic Linear Algebra Subprograms)并不直接应用于图论的计算,而是作为一套线性代数计算中通用的基本运算操作函数集合,用于进行向量和矩阵的基本运算。然而,这些基本运算在图论的相…

csrf漏洞与ssrf漏洞

环境:用kali搭建的pikachu靶场 一.CSRF 1.CSRF漏洞简介 跨站请求伪造(CSRF)漏洞是一种Web应用程序安全漏洞,攻击者通过伪装成受信任用户的请求来执行未经授权的操作。这可能导致用户在不知情的情况下执行某些敏感操作&#xff0…

遥感之特征选择-禁忌搜索算法

各类智能优化算法其主要区别在于算法的运行规则不同,比如常用的遗传算法,其规则就是变异,交叉和选择等,各种不同的变体大多是在框架内的实现细节不同,而本文中的禁忌算法也是如此,其算法框架如下进行介绍。…

丰盘v24.5集成OnlyOffice 7.5版本,支持子管理员高级特性

五一劳动节刚过,我们的开发小伙伴上线发布了v24.5版本,支持原生集成OnlyOffice 7.5的套件版本,无需管理员手工配置密钥证书等繁琐操作,对Word、PPT和Excel文件有了更强的兼容性和稳定性,例如当文件里包含Visio图像时&a…

C之动态内存管理(动态内存开辟与调整等)

目录 1.为什么要有动态内存分配 2.malloc、calloc、realloc和free malloc: calloc: realloc: free: 3.常见的动态内存的错误 3.1:对NULL指针的解引用操作 3.2:对动态开辟空间的越界访问 3.3&…

长城电脑如何恢复删除文件?盘点几个实用方法

咨询:急求帮助!我不慎在长城电脑上删除了文件,还有机会恢复吗?一个疏忽,就把一份至关重要的工作文件给删掉了!请大家快快伸出援手,帮我找回这份文件吧! 在使用长城电脑的过程中&…

Linux_应用篇(11) 线程

上一章,学习了进程相关的知识内容, 对进程有了一个比较全面的认识和理解; 本章开始, 将学习 Linux应用编程中非常重要的编程技巧---线程(Thread) ;与进程类似,线程是允许应用程序并发…

GaussDB数据库如何创建修改数据库和数据表

目录 一、背景 二、创建数据库和数据表 1. 创建数据库 2.创建数据表 三、修改表结构 1. 添加列 2. 修改列 3. 删除列 四、添加约束 1. 添加主键约束 2. 添加外键约束 3.添加唯一性约束 五、示例代码 -- 创建数据库 -- 使用新创建的数据库 -- 创建 department 表…

发送Http请求的两种方式

说明:在项目中,我们有时会需要调用第三方接口,获取调用结果,来实现自己的业务逻辑。调用第三方接口,通常是双方确定好,由对方开放一个接口,需要我们根据他们提供的接口文档,组装Http…

MySQL 使用方法以及教程

一、引言 MySQL是一个流行的开源关系型数据库管理系统(RDBMS),广泛应用于Web开发、数据分析等领域。它提供了高效、稳定的数据存储和查询功能。同时,Python作为一种强大的编程语言,也提供了多种与MySQL交互的库&#…

Ubuntu 24.04 LTS 安装Docker

1 更新软件包索引: sudo apt-get update 2 安装必要的软件包,以允许apt通过HTTPS使用仓库: sudo apt-get install apt-transport-https ca-certificates curl software-properties-common 3 添加Docker的官方GPG密钥: curl -fs…

算法金 | 你真的完全理解 Logistic 回归算法了吗

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 今日 178/10000 1. 引言 吴恩达:机器学习的六个核心算法!, 通透!!十大回…

Python专为开发和部署数据驱动的应用程序库之taipy使用详解

概要 Taipy 是一个强大的 Python 库,专为开发和部署数据驱动的应用程序而设计。它通过提供一套丰富的工具和组件,使开发者能够快速构建和维护复杂的业务逻辑和数据交互界面。无论是金融分析、供应链管理还是任何需要高度数据交互的应用,taipy 都能提供高效的解决方案。 安装…

Orange AIpro开箱上手

0.介绍 首先感谢官方给到机会,有幸参加这次活动。 OrangePi AIpro(8T)采用昇腾AI技术路线,具体为4核64位处理器AI处理器,集成图形处理器,支持8TOPS AI算力,拥有8GB/16GB LPDDR4X,可以外接32GB/64GB/128GB/2…

小程序抓包详细教程

小程序抓包详细教程 前言:关于小程序抓包一直想写出一个比较详细的教程 实验设备: ​ 微信: https://windows.weixin.qq.com/?langzh_CN ​ Proxifier:https://www.proxifier.com/download/ (需要挂梯子访问下载) ​ burpsuite&#xff…

1.JAVA小项目(零钱通)

一、说明 博客内容:B站韩顺平老师的视频,以及代码的整理。此项目分为两个版本: 面向过程思路实现面向对象思路实现 韩老师视频地址:【【零基础 快速学Java】韩顺平 零基础30天学会Java】 https://www.bilibili.com/video/BV1fh4…

Spring 源码:深度解析AOP源码配置解析

文章目录 一、 解析AOP配置的入口1.1 从XML配置到AOP Namespace的解析流程1.2 分析注解驱动的AOP配置解析流程 二、AOP配置解析的核心流程2.1 ConfigBeanDefinitionParser 类2.2 parse()2.3 parseAdvisor()2.4 parseAspect()2.5 parsePointcut()2.6 createAdvisorBeanDefinitio…

算法每日一题(python,2024.05.29) day.11

题目来源(力扣. - 力扣(LeetCode),简单) 解题思路: 法一:切片函数法 直接用python中的切片函数直接解决 法二:交换法 从俩头开始交换字符串的数字,若为奇数&#xff…

GITLAB常见问题总结

Troubleshooting GitLab Pages administration (FREE SELF) 原文地址 stage: Plan group: Knowledge info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/…

STM8单片机变频器设计

变频调速技术是现代电力传动技术的重要发展方向,而作为变频调速系统的核心—变频器的性能也越来越成为调速性能优劣的决定因素,除了变频器本身制造工艺的“先天”条件外,对变频器采用什么样的控制方式也是非常重要的。随着电力电子技术、微电子技术、计算机网络等高新技术的…