用正则表达式处理一个复杂字符串(类似json格式)
#利用正则输出{}中的内容
str1="""var local=[{provinceCode:'310000',
cityCode:'310100',
text:'上海',
dpt:'20222003',
carNo:'沪A',
pName:'上海市',
cName:'上海市'},
cityCode:'310100',
text:'上海',
dpt:'20222003',
carNo:'沪A',
pName:'上海市',
cName:'上海市'},
{provinceCode:'322222',
cityCode:'310100',
text:'北京',
dpt:'20222003',
carNo:'京A',
pName:'北京市',
cName:'北京市'}]"""
cityCode:'310100',
text:'北京',
dpt:'20222003',
carNo:'京A',
pName:'北京市',
cName:'北京市'}]"""
#方法1
import re
print(re.findall(r'{?\w+:\'\w*\',?}?',str1,re.I|re.M)) res=re.sub(r'\s+','',str1,re.I|re.M) print('res:',res) result=re.findall(r'{?\w+:\'\w+\',?}?',res,re.I|re.M) print('result:',result) rr='' import string s=string.punctuation d={} for i in result: if i[0]=='{': #处理 第一行包含{开头的 out_key=i.split(':')[1].strip(s) d[out_key]={} inner_key=i.split(':')[0][1:] value=i.split(':')[1].strip(s) d[out_key][inner_key]=value elif i[-1]=='}': #处理最后一行包含}结尾的 inner_key=i.split(':')[0] value=i.split(':')[1][:-1].strip(s) d[out_key][inner_key]=value else: #处理中间普通行 inner_key=i.split(':')[0] value=i.split(':')[1].strip(s) d[out_key][inner_key]=value print('处理结果:',d) for i in result: print('分组打印:',i)
#方法2 #直接取到了大括号内的内容的匹配方式: print(re.findall(r'{.*?}',str1,re.M|re.DOTALL)) #然后把结果处理成一个字典: result=re.findall(r'{.*?}',str1,re.M|re.DOTALL) print('吴老师的reuslt:',result) def func(s): s='"'+str(s.group(1))+'"' #正常不需要 返回:但是处理京A的A特殊处理一下 return s d={} for i in result: outkey=re.search(r'province\w+:(\'\w+\')',i).group(1) #以province的编号作为外层key d[outkey]={} #定义内层字典,存储明细 temp=re.sub(r"[{}\s]+","",i) #替换掉字符串的{}及空白 temp=re.sub(r'([a-zA-Z]+)(?=:)',func,temp) #正常不加:,但是会导致京A的A被加"",所以使用后置肯定(?=:),表示有:的才会匹配
print(temp) s='dd='+'{'+temp+'}' #用exec处理内层字符串为字典 exec(s) d[outkey]=dd print('最终处理结果:',d)