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次
 两个和.结合,就表示随意匹配,然后##,和非贪婪,就能把#之间的数据匹配出来了
需要被替换的槽位名称(参数)找到后,下一步就是找被替换的参数了










