2 回答

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']]]]]
添加回答
舉報(bào)