Python,如何解析key = value list忽略括号内的内容?
发布时间:2020-12-20 11:23:35 所属栏目:Python 来源:网络整理
导读:假设我有一个这样的字符串: "key1=value1;key2=value2;key3=(key3.1=value3.1;key3.2=value3.2)" 我想得到一个与上面相对应的字典,其中key3的值是字符串 "(key3.1=value3.1;key3.2=value3.2)" 并最终得到相应的子词典. 我知道如何用分号分割字符串,但是如何
假设我有一个这样的字符串:
"key1=value1;key2=value2;key3=(key3.1=value3.1;key3.2=value3.2)" 我想得到一个与上面相对应的字典,其中key3的值是字符串 "(key3.1=value3.1;key3.2=value3.2)" 并最终得到相应的子词典. 我知道如何用分号分割字符串,但是如何告诉解析器忽略括号之间的分号? 目前我正在使用一个特殊的例程,寻找成对的匹配括号,“清除”其内容,获取拆分位置并将它们应用于原始字符串,但这看起来并不优雅,必须有一些预先打包的pythonic方式做这个. 如果有人有兴趣,这是我目前使用的代码: def pparams(parameters,sep=';',defs='=',brc='()'): ''' unpackages parameter string to struct for example,pippo(a=21;b=35;c=pluto(h=zzz;y=mmm);d=2d3f) becomes: a: '21' b: '35' c.fn: 'pluto' c.h='zzz' d: '2d3f' fn_: 'pippo' ''' ob=strfind(parameters,brc[0]) dp=strfind(parameters,defs) out={} if len(ob)>0: if ob[0]<dp[0]: #opening function out['fn_']=parameters[:ob[0]] parameters=parameters[(ob[0]+1):-1] if len(dp)>0: temp=smart_tokenize(parameters,sep,brc); for v in temp: defp=strfind(v,defs) pname=v[:defp[0]] pval=v[1+defp[0]:] if len(strfind(pval,brc[0]))>0: out[pname]=pparams(pval,defs,brc); else: out[pname]=pval else: out['fn_']=parameters return out def smart_tokenize( instr,brc='()' ): ''' tokenize string ignoring separators contained within brc ''' tstr=instr; ob=strfind(instr,brc[0]) while len(ob)>0: cb=findclsbrc(tstr,ob[0]) tstr=tstr[:ob[0]]+'?'*(cb-ob[0]+1)+tstr[cb+1:] ob=strfind(tstr,brc[1]) sepp=[-1]+strfind(tstr,sep)+[len(instr)+1] out=[] for i in range(1,len(sepp)): out.append(instr[(sepp[i-1]+1):(sepp[i])]) return out def findclsbrc(instr,brc_pos,brc='()'): ''' given a string containing an opening bracket,finds the corresponding closing bracket ''' tstr=instr[brc_pos:] o=strfind(tstr,brc[0]) c=strfind(tstr,brc[1]) p=o+c p.sort() s1=[1 if v in o else 0 for v in p] s2=[-1 if v in c else 0 for v in p] s=[s1v+s2v for s1v,s2v in zip(s1,s2)] s=[sum(s[:i+1]) for i in range(len(s))] #cumsum return p[s.index(0)]+brc_pos def strfind(instr,substr): ''' returns starting position of each occurrence of substr within instr ''' i=0 out=[] while i<=len(instr): try: p=instr[i:].index(substr) out.append(i+p) i+=p+1 except: i=len(instr)+1 return out 解决方法
如果你想构建一个真正的解析器,请使用
Python parsing libraries中的一个,如
PLY或
PyParsing.如果你认为这样一个成熟的库对于手头的任务来说太过分了,那就去找一个像你已经拥有的那样的黑客.我很确定没有外部库没有干净的几行解决方案.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |