我有一個看起來像這樣的配置文本:解析TCL般的文字
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獲得結果的最佳方式是什麼?
BLOBKEY如何告訴你該值不應該被解析?因爲它全部大寫?因爲它是字面的「BLOBKEY」? – PaulMcG 2011-04-08 07:58:20
因爲這是字面意思。但問題是它可能出現在任何層面。也許這不是最好的例子...你可以有key.subkey.subsubkey,如果我看到這個預定義的路徑序列,我應該停止解析並閱讀它的內容,作爲原始文本在{}之間。 – jonozzz 2011-04-08 22:53:31