项目中用动态表达式替换参数

该博客介绍了一个Python函数,用于通过正则表达式动态替换JSON字符串中的参数。函数首先查找字符串中的槽位名,然后从提供的对象中获取相应属性值进行替换。使用非贪婪模式匹配#...#中的内容,通过getattr()获取对象属性,实现字符串的动态更新。
摘要由CSDN通过智能技术生成
def replace_args_by_re(json_str,obj):
    '''
    通过正则表达式动态的替换参数
    :param json_str:  需要被替换的json字符串
    :param obj:    提供数据的对象
    :return:       替换后的字符串
    '''
    #1.先找出字符串中的槽位名(参数)
    args = re.findall('#(.*?)#',json_str)
    #再去数据对象中获取对应名字的参数的值
    for arg in args:
        #3.获取obj中对应参数名的属性值
        value = getattr(obj,arg,None)
        #4.如果有属性则替换
        if value is not None:
            json_str = json_str.replace('#{}#'.format(arg),str(value))

    return json_str

1.先定义一个函数,设置2个必传参数,json_str,和obj

2.在python中re模块实现了正则表达式的功能

2.1

re.findall(pattern,string,flag)
在目标字符串中找到所有匹配的子串,并返回列表,没有则返回空列表
—pattern 正则表达式(字符串)
—string 被匹配的字符串
—flag 标志位,匹配模式,控制正则表达式的匹配模式

2.2

通配符 . :默认匹配除了\n之外的任意单个字符(\n 代表一个字符)
重复元字符

  • 匹配前面的子表达式0-n次
  • 匹配前面的子表达式1-n次
    ? 匹配前面的子表达式0-1次

2.3

非贪婪模式
在默认情况下 * + {n,m}会尽可能多的匹配前面的子表达式,叫做贪婪模式

如果在重复元字符后面加上一个?表示非贪婪,尽可能的少匹配字符

解释匹配
args = re.findall(’#(.*?)#’,json_str)
括号外面的两个#号表示 在s1中的##开始匹配,如下代码所示,
如果正则表达式在括号右边加上#,则表示从最开始到s1中最后的#开始匹配
如果正则表达式在括号左边加上#,则表示从s1最开始的#匹配到最后
如果正则表达式在括号左右两边都加上#,则表示从s1开始的#匹配到最后一个#号

import re
s1 = '{"headers": {"X-Lemonban-Media-Type": "lemonban.v2","Authorization":"Bearer #token#"},' \
     '"json":{"member_id":#member_id#,"amount":888}}'
res = re.findall('(.*)#',s1)
res1 = re.findall('#(.*)',s1)
res2 =re.findall('#(.*)#',s1)
print(res)
print(res1)
print(res2)

结果如下:
在这里插入图片描述
这边需要用到非贪婪模式

import re
s1 = '{"headers": {"X-Lemonban-Media-Type": "lemonban.v2","Authorization":"Bearer #token#"},' \
     '"json":{"member_id":#member_id#,"amount":888}}'
res1 = re.findall('#(.*)',s1)
res2 =re.findall('#(.*?)#',s1)
res3 =re.findall('#(.+?)#',s1)
print(res2)
print(res3)

结果如下

在这里插入图片描述
注意:问号需要英文格式的,
*表示匹配前面的0-n次
+表示匹配前面的1-n次
两个和.结合,就表示随意匹配,然后##,和非贪婪,就能把#之间的数据匹配出来了

需要被替换的槽位名称(参数)找到后,下一步就是找被替换的参数了

3.getattr语法

getattr()函数用户返回一个对象的属性值

getattr(obj,name[ ,default])

参数:
obj------对象
name ------字符串,对象属性
default -----默认返回值,如果不提供该参数,在没有对应属性时,将触发AttributeError

返回值
返回对象属性

class    A(object):
    bar ='我是对象属性'

a = A()
print(getattr(a,'bar'))      #打印出A的bar的对象属性
# print(getattr(a,'bar2'))   #没有bar2,所以会直接触发Attribute
print(getattr(a,'bar2','我是没有对象属性时,设置的默认值'))   #打印时没有bar2,则打印默认值

查看执行的结果

在这里插入图片描述

1.获取到槽位后,[‘token’,‘member_id’],(json_str)

2.再去数据对象obj中获取对应名字的参数的值
将每个槽位进行迭代,
for arg in args:
获取obj中对应参数的属性名
value = getattr(obj,arg,None)

#如果有属性则替换
将arg格式化, value 设置成字符串格式

最后返回被替换的值



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值