Python,如何解析key = value list忽略括号内的内容?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python,如何解析key = value list忽略括号内的内容?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2327字,纯文字阅读大概需要4分钟。
内容图文
![Python,如何解析key = value list忽略括号内的内容?](/upload/InfoBanner/zyjiaocheng/743/27421e8875204cd3a36ef60a7e558013.jpg)
假设我有一个这样的字符串:
"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,sep,defs,brc);
else:
out[pname]=pval
else:
out['fn_']=parameters
return out
def smart_tokenize( instr, sep=';', 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.如果你认为这样一个成熟的库对于手头的任务来说太过分了,那就去找一个像你已经拥有的那样的黑客.我很确定没有外部库没有干净的几行解决方案.
内容总结
以上是互联网集市为您收集整理的Python,如何解析key = value list忽略括号内的内容?全部内容,希望文章能够帮你解决Python,如何解析key = value list忽略括号内的内容?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。