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 设置成字符串格式
最后返回被替换的值