すばらしい python ライブラリを使用してファイルを解析しようとしていますpyparsing
が、多くの問題が発生しています...
解析しようとしているファイルは次のようなものです。
sectionOne:
list:
- XXitem
- XXanotherItem
key1: value1
product: milk
release: now
subSection:
skey : sval
slist:
- XXitem
mods:
- XXone
- XXtwo
version: last
sectionTwo:
base: base-0.1
config: config-7.0-7
ご覧のとおり、インデントされた構成ファイルです。これは多かれ少なかれ、文法を定義しようとした方法です
- ファイルには 1 つ以上のセクションを含めることができます
- 各セクションは、セクション名とセクションの内容で構成されます。
- 各セクションにはインデントされたコンテンツがあります
- 各セクションのコンテンツには、キーと値のペアまたはサブセクションを 1 つ以上含めることができます。
- 各値は、単一の単語またはアイテムのリストにすることができます。
- アイテムのリストは、1 つ以上のアイテムのグループです。
- 各項目はハイフン + 'XX' で始まる名前
pyparsing を使用してこの文法を作成しようとしましたが、成功しませんでした。
import pprint
import pyparsing
NEWLINE = pyparsing.LineEnd().suppress()
VALID_CHARACTERS = pyparsing.srange("[a-zA-Z0-9_\-\.]")
COLON = pyparsing.Suppress(pyparsing.Literal(":"))
HYPHEN = pyparsing.Suppress(pyparsing.Literal("-"))
XX = pyparsing.Literal("XX")
list_item = HYPHEN + pyparsing.Combine(XX + pyparsing.Word(VALID_CHARACTERS))
list_of_items = pyparsing.Group(pyparsing.OneOrMore(list_item))
key = pyparsing.Word(VALID_CHARACTERS) + COLON
pair_value = pyparsing.Word(VALID_CHARACTERS) + NEWLINE
value = (pair_value | list_of_items)
pair = pyparsing.Group(key + value)
indentStack = [1]
section = pyparsing.Forward()
section_name = pyparsing.Word(VALID_CHARACTERS) + COLON
section_value = pyparsing.OneOrMore(pair | section)
section_content = pyparsing.indentedBlock(section_value, indentStack, True)
section << pyparsing.Group(section_name + section_content)
parser = pyparsing.OneOrMore(section)
def main():
try:
with open('simple.info', 'r') as content_file:
content = content_file.read()
print "content:\n", content
print "\n"
result = parser.parseString(content)
print "result1:\n", result
print "len", len(result)
pprint.pprint(result.asList())
except pyparsing.ParseException, err:
print err.line
print " " * (err.column - 1) + "^"
print err
except pyparsing.ParseFatalException, err:
print err.line
print " " * (err.column - 1) + "^"
print err
if __name__ == '__main__':
main()
これは結果です:
result1:
[['sectionOne', [[['list', ['XXitem', 'XXanotherItem']], ['key1', 'value1'], ['product', 'milk'], ['release', 'now'], ['subSection', [[['skey', 'sval'], ['slist', ['XXitem']], ['mods', ['XXone', 'XXtwo']], ['version', 'last']]]]]]], ['sectionTwo', [[['base', 'base-0.1'], ['config', 'config-7.0-7']]]]]
len 2
[
['sectionOne',
[[
['list', ['XXitem', 'XXanotherItem']],
['key1', 'value1'],
['product', 'milk'],
['release', 'now'],
['subSection',
[[
['skey', 'sval'],
['slist', ['XXitem']],
['mods', ['XXone', 'XXtwo']],
['version', 'last']
]]
]
]]
],
['sectionTwo',
[[
['base', 'base-0.1'],
['config', 'config-7.0-7']
]]
]
]
ご覧のとおり、主な問題が 2 つあります。
1.- 各セクションのコンテンツはリストに 2 回入れ子になっています
2.- キー「version」は、「sectionOne」に属する場合、「subSection」内で解析されます
私の本当の目標は、各フィールドの情報を簡単に抽出するためのキーと値を持つ python のネストされた辞書の構造を取得できるようにすることですが、それpyparsing.Dict
は私にはわかりにくいものです。
誰でも私を助けてもらえますか?
前もって感謝します
(長文すみません)