2013-05-09 2 views
3

Я пытаюсь использовать Pyparsing для разбора файла конфигурации следующей формыСинтаксический конфигурационный файл с помощью Pyparsing

x = "/user/test" 
y = 3 

Вот мой фрагмент кода

ParserElement.defaultWhitespaceChars = (" \t") 
END = StringEnd() 
NL = LineEnd().suppress() 
assignment = Literal('=') 

key_str = CharsNotIn("=") 
value_str = Group(~assignment + restOfLine) 

line = Group(key_str + assignment + value_str) 
lines = ZeroOrMore(line) 
lines.ignore(NL) 

text = """ 
y = 3 
x = 2 
""" 

Вывод, который я получаю от parseFile говорит мне он анализирует только первую строку. Может ли кто-нибудь помочь мне узнать, что я делаю неправильно?

+0

Вы были бы прочь использовать библиотеку, которая уже может анализировать файлы которые выглядят вроде этого? Например, https://pypi.python.org/pypi/configobj/ – SingleNegationElimination

+0

Благодарим вас за ввод. Существует дополнительная работа по синтаксическому анализу (например, анализ журнала планировщика, некоторые файлы сценариев и т. Д.). В этом контексте я пытаюсь лучше понять пираринг за последние несколько недель. Я считаю себя новичком в области пиражей, поэтому хотел бы получить некоторые указания о том, что я сделал не так. –

+0

@AbhijitBhattacharya - поиск SO для других вопросов/ответов с тегом 'pyparsing'. Вы также можете посетить wiki по адресу http://pyparsing.wikispace.com и прочитать вкладку «Обсуждение» на домашней странице wiki. – PaulMcG

ответ

2

Похоже, вы на правильном пути. Возможно, вы делаете что-то не так, когда акутально передаете text в грамматику. Добавление следующей строки в коде

print lines.parseString(text) 

дает ожидаемый результат

[['y ', '=', [' 3']], ['x ', '=', [' 2']]] 

Как и в сторону, как правило, вы не хотите сохранить пробелы при разборе. Обычно важны жетоны. Это, как я хотел бы разобрать ваш пример:

EOL = LineEnd().suppress() 
EQ = Literal("=").suppress() 
val = Word(alphanums) 
line = Group(val('key') + EQ + val('val') + EOL) 
grammar = OneOrMore(line) 

for x in grammar.parseString(text): 
    print x.dump() 

Выход в этом случае намного лучше

['y', '3'] 
- key: y 
- val: 3 
['x', '2'] 
- key: x 
- val: 2 
+0

Спасибо. Ты прав. Я получил это сейчас. –

+0

Нет проблем, и добро пожаловать в переполнение стека! Как правило, протокол должен поддерживать полезные ответы и «принимать» ответ, который решает вашу проблему. – Hooked

+0

Я обновил ответ, чтобы показать другой подход в грамматике. – Hooked

Смежные вопросы