第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

用柯利布雷特斯解析文件

用柯利布雷特斯解析文件

達(dá)令說(shuō) 2021-03-02 21:18:36
我需要用括號(hào)將信息解析為一個(gè)文件,例如:Continent{Name    EuropeCountry{Name    UKDog{Name    FiffiColour  Gray}Dog{Name    SmutColour  Black}}}這是我在Python中嘗試過(guò)的from io import openfrom pyparsing import *import pprintdef parse(s):    return nestedExpr('{','}').parseString(s).asList()def test(strng):    print strng    try:        cfgFile = file(strng)        cfgData = "".join( cfgFile.readlines() )        list = parse( cfgData )        pp = pprint.PrettyPrinter(2)        pp.pprint(list)    except ParseException, err:        print err.line        print " "*(err.column-1) + "^"        print err    cfgFile.close()    print    return listif __name__ == '__main__':    test('testfile')但這失敗并顯示錯(cuò)誤:testfileContinent^Expected "{" (at char 0), (line:1, col:1)Traceback (most recent call last):  File "xxx.py", line 55, in <module>    test('testfile')  File "xxx.py", line 40, in test    return listUnboundLocalError: local variable 'list' referenced before assignment  我需要做些什么才能使這項(xiàng)工作?是比pyparsing更好的解析器嗎?
查看完整描述

2 回答

?
明月笑刀無(wú)情

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊

遞歸是這里的關(guān)鍵。嘗試一些解決方法:


def parse(it):

    result = []

    while True:

        try:

            tk = next(it)

        except StopIteration:

            break


        if tk == '}':

            break

        val = next(it)

        if val == '{':

            result.append((tk,parse(it)))

        else:

            result.append((tk, val))


    return result

用例:


import pprint       


data = """

Continent

{

Name    Europe

Country

{

Name    UK

Dog

{

Name    Fiffi

Colour  Gray

}

Dog

{

Name    Smut

Colour  Black

}

}

}

"""


r = parse(iter(data.split()))

pprint.pprint(r)

...產(chǎn)生(Python 2.6):


[('Continent',

  [('Name', 'Europe'),

   ('Country',

    [('Name', 'UK'),

     ('Dog', [('Name', 'Fiffi'), ('Colour', 'Gray')]),

     ('Dog', [('Name', 'Smut'), ('Colour', 'Black')])])])]

請(qǐng)僅以此為起點(diǎn),并隨時(shí)根據(jù)需要改進(jìn)代碼(取決于數(shù)據(jù),字典可能是更好的選擇)。此外,示例代碼無(wú)法處理格式錯(cuò)誤的數(shù)據(jù)(特別是多余或丟失的數(shù)據(jù)}-我敦促您進(jìn)行完整的測(cè)試;)


編輯:發(fā)現(xiàn)后pyparsing,我嘗試了以下方法,這些方法似乎可以(更好)地工作,并且可以(更)容易地針對(duì)特殊需求進(jìn)行定制:


import pprint

from pyparsing import Word, Literal, Forward, Group, ZeroOrMore, alphas


def syntax():

    lbr = Literal( '{' ).suppress()

    rbr = Literal( '}' ).suppress()

    key = Word( alphas )

    atom = Word ( alphas )

    expr = Forward()

    pair = atom | (lbr + ZeroOrMore( expr ) + rbr)

    expr << Group ( key + pair )


    return expr


expr = syntax()

result = expr.parseString(data).asList()

pprint.pprint(result)

生產(chǎn):


[['Continent',

  ['Name', 'Europe'],

  ['Country',

   ['Name', 'UK'],

   ['Dog', ['Name', 'Fiffi'], ['Colour', 'Gray']],

   ['Dog', ['Name', 'Smut'], ['Colour', 'Black']]]]]


查看完整回答
反對(duì) 回復(fù) 2021-03-30
  • 2 回答
  • 0 關(guān)注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)