0
点赞
收藏
分享

微信扫一扫

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

知年_7740 2022-04-18 阅读 43
python
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次
两个和.结合,就表示随意匹配,然后##,和非贪婪,就能把#之间的数据匹配出来了

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



举报

相关推荐

0 条评论