加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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.如果你认为这样一个成熟的库对于手头的任务来说太过分了,那就去找一个像你已经拥有的那样的黑客.我很确定没有外部库没有干净的几行解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读