ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 解析类似TCL的文本

2019-06-30 19:44:27  阅读:171  来源: 互联网

标签:python pyparsing


我有一个如下所示的配置文本:

text="""
key1 value1
key2 { value1 value2 }
key3 subkey1 {
    key1 1
    key2 2
    key3 {
        value1
    }
}

BLOBKEY name {
    dont {
        # comment
        parse { me }
    }
}

key3 subkey2 {
    key1 value1
}

"""

值是纯字符串或带引号的字符串.键只是字母串.我事先知道key2和key3.subkey1.key4将保存集合,所以我可以区别对待这些路径.同样,我知道BLOBKEY将包含一个“转义”配置部分.

目标是将其转换为如下所示的字典:

{'key1': 'value1',
 'key2': set(['value1', 'value2']),
 'key3': {
    'subkey1': {
        'key1': 1,
        'key2': 2,
        'key3': set(['value1']),
    },
    'subkey2': {
        'key1': 'value1'
    }
 },
 'BLOBKEY': {
    'name': "    dont {\n        # comment\n        parse { me }\n    }\n"
 }
}

下面的代码在将其分解为一堆嵌套列表方面做得相当不错.

import pyparsing
string = pyparsing.CharsNotIn("{} \t\r\n")
group = pyparsing.Forward()
group << ( 
           pyparsing.Group(pyparsing.Literal("{").suppress() + 
                           pyparsing.ZeroOrMore(group) + 
                           pyparsing.Literal("}").suppress()) |
           string
           )

toplevel = pyparsing.OneOrMore(group)

在Python中使用pyparsing获得我想要的结果的最佳方法是什么?

解决方法:

到目前为止,这是我的进展.它不解析原始blob,但其他一切似乎都是正确的.

LBRA = Literal("{").suppress()
RBRA = Literal("}").suppress()
EOL = lineEnd.suppress()
tmshString = Word(alphanums + '!#$%&()*+,-./:;<=>?@[\]^_`|~')

tmshValue = Combine( tmshString | dblQuotedString.setParseAction( removeQuotes ))
tmshKey = tmshString

def toSet(s, loc, t):
    return set(t[0])

tmshSet = LBRA + Group(ZeroOrMore(tmshValue.setWhitespaceChars(' '))).setParseAction(toSet) + RBRA

def toDict(d, l):
    if not l[0] in d:
        d[l[0]] = {}

    for v in l[1:]:
        if type(v) == list:
            toDict(d[l[0]],v)
        else:
            d[l[0]] = v

def trueDefault(s, loc, t):
    return len(t) and t or True

singleKeyValue = Forward()
singleKeyValue << (
            Group(
                tmshKey +  (
                            # A toggle value (i.e. key without value).
                            EOL.setParseAction(trueDefault) |
                            # A set of values on a single line.
                            tmshSet |
                            # A normal value or another singleKeyValue group.
                            Optional(tmshValue | LBRA + ZeroOrMore(singleKeyValue) + RBRA).setParseAction(trueDefault)
                           )
            )
)

multiKeysOneValue = Forward()
multiKeysOneValue << (
            Group(
                tmshKey + (
                            multiKeysOneValue | 
                            tmshSet  |
                            LBRA + ZeroOrMore(singleKeyValue) + RBRA
                          )
            )
)



toplevel = OneOrMore(multiKeysOneValue)

# now parse data and print results
data = toplevel.parseString(testData)

h = {}
map(lambda x:toDict(h, x), data.asList())
pprint(h)

标签:python,pyparsing
来源: https://codeday.me/bug/20190630/1339545.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有