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

文章目录

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

背景

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

配置文件示例内容如下:


D:\project\test\properties.txt

ip=192.168.1.66
user=xiaoshuai
password=123456

login_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 re

path = 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] = value

for k, v in var_dict.items():
    print(f"{k}\t{v}")

结果如下:

image-20240530125209474

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

word里面没有Acrobat选项

加载项被禁止,选择项里面,没有Acrobat选项 文件-》选项 加载项-》com加载项-》转到 添加Acrobat 出现Acrobat选项

阿里云部署nodejs

目录 1、安装node.js 1-1 进入opt/software 1-2 下载node.js安装包 1-3 解压 2 配置环境变量 2-1 vim中配置环境变量 2-2 命令行中保存环境变量 2-3 检查安装版本 2-3 更换镜像 3、上传node.js项目 1-1 启动项目 1-2 配置对应的安全组 ​编辑 4、pm2启动多个node项…

《PNAS》和《Nature Communications》仿章鱼和蜗牛的粘液真空吸附,赋予了机器人吸盘新的“超能力”

想象一下,如果机器人能够像章鱼一样牢牢吸附在粗糙崎岖的岩石上,或者像蜗牛那样在墙面上悠然负重爬行,那会是多么神奇的一幕!近日,布里斯托大学机器人实验室的Jonathan Rossiter教授课题组就为我们带来了这样的“超能力…

Java_Mybatis

Mybatis是一款优秀的持久层框架,用户简化JDBC(使用Java语言操作关系型数据库的一套API)开发 使用Mybatis查询所有用户数据: 代码演示: UserMapper: Mapper //被调用时会通过动态代理自动创建实体类,并放入IOC容器中…

一文了解JVM面试篇(上)

Java内存区域 1、如何解释 Java 堆空间及 GC? 当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建 堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一 个进程,回收无效对象的内存用于将来的分配。 2、JVM 的主要组成…

JVM学习-详解类加载器(一)

类加载器 类加载器是JVM执行类加载机制的前提 ClassLoader的作用 ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类型对应的ja…

什么是TLAB?

这个得从内存申请说起。 一般而言生成对象需要向堆中的新生代申请内存空间,而堆又是全局共享的,像新生代内存又是规整的,是通过一个指针来划分的。 内存是紧凑的,新对象创建指针就右移对象大小size即可,这叫指针加法…

Linux 的权限

目录 Linux 的用户 root 用户 和 普通用户 如何新建普通用户? 如何切换用户? 一开始是以 root 用户登录: 一开始以普通用户登录: 如何删除用户? Linux文件权限 什么是读权限( r )&#…

数据结构学习笔记

1. 数组 (Array) 定义 数组是一种线性数据结构,用于存储固定大小的相同类型元素集合。每个元素都有一个索引,用于快速访问。 特点 优点:访问速度快,通过索引直接访问O(1)时间复杂度。缺点:大小固定,插入…

Unity 自定义房间布局系统 设计与实现一个灵活的房间放置系统 ——自定义房间区域功能

自定义房间区域功能 效果: 功能: 能够自定义房间的大小一键生成放置区域可控的放置网格点当物体放置到区域内可自动吸附物体是否可放置,放置时如果与其他物体交叉则不可放置(纯算法计算)管理房间内的物体&#xff0c…

MySQL(二)-基础操作

一、约束 有时候,数据库中数据是有约束的,比如 性别列,你不能填一些奇奇怪怪的数据~ 如果靠人为的来对数据进行检索约束的话,肯定是不行的,人肯定会犯错~因此就需要让计算机对插入的数据进行约束要求! 约…

下载HF AutoTrain 模型的配置文件

下载HF AutoTrain 模型的配置文件 一.在huggingface上创建AutoTrain项目二.通过HF用户名和autotrain项目名,拼接以下url,下载模型列表(json格式)到指定目录三.解析上面的json文件、去重、批量下载模型配置文件(权重以外的文件) 一.在huggingface上创建AutoTrain项目 二.通过HF用…

电脑没电关机,wsl和docker又挂了,附解决过程

如题,开了个会没带笔记本电源,点啊弄关机后docker打不开,我以为是docker坏了,结果docker报错: An unexpected error occurred while executing a WSL command. Either shut down WSL down with wsl --shutdown, and/or…

植被变化趋势线性回归以及可视化

目录 植被变化线性回归ee.Reducer.linearFit().reduce()案例:天水市2004-2023年EVI线性回归趋势在该图中,使用了从红色到蓝色的渐变来表示负趋势到正趋势。红色代表在某段时间中,植被覆盖减少,绿色表示持平,蓝色表示植被覆盖增加。 植被变化线性回归 该部分参考Google…

Java(十一)---String类型

文章目录 前言1.String类的重要性2.常用方法2.1.字符串的创建2.2.字符串的比较2.2.1.比较是否引用同一个对象2.2.2.boolean equals(Object anObject) 方法:2.2.3.int CompareTo(String s)2.2.4.int compareToIgnoreCase(String str) 方法: 2.3.字符串的查…

单调栈原理+练习

首先用一道题引出单调栈 码蹄集 (matiji.net) 首先画一个图演示山的情况: 最暴力的做法自然是O(n方)的双循环遍历,这么做的思想是求出当前山右侧有多少座比它小的山,遇见第一个高度大于等于它的就停止。 但是对于我们所求的答案数&#xff…

能不能接受这些坑?买电车前一定要看

图片来源:汽车之家 文 | Auto芯球 作者 | 雷慢 刚有个朋友告诉我,买了电车后感觉被骗了, 很多“坑”都是他买车后才知道的。 不提前研究,不做功课,放着我这个老司机不请教, 这个大冤种他不当谁当&…

C# WinForm —— 25 ProgressBar 介绍与使用

1. 简介 用于显示某个操作的进度 2. 常用属性 属性解释(Name)控件ID,在代码里引用的时候会用到,一般以 pbar 开头ContextMenuStrip右键菜单Enabled控件是否可用ForeColor用于显示进度的颜色MarqueeAnimationSpeed进度条动画更新的速度,以毫秒为单位M…

【Python】解决Python错误报错:IndexError: tuple index out of range

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

什么是PLAB?

接上文PLAB---》 可以看到和TLAB很像,PLAB即 Promotion Local Allocation Buffers。用在年轻代对象晋升到老年代时。 在多线程并行执行YGC时,可能有很多对象需要晋升到老年代,此时老年代的指针就"热"起来了,于是搞了个…