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

项目中用动态表达式替换参数,第1张

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 设置成字符串格式

最后返回被替换的值



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/715106.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存