2013-05-09 103 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 2013-05-09 17:43:53

+0

感謝您的輸入。我正在執行額外的解析工作(例如解析調度程序日誌,某些腳本文件等)。在這種情況下,我試圖更好地理解過去幾周的pyparsing。我認爲自己是pyparsing領域的新手,所以想要得到一些關於我在這裏做錯了什麼的指示。 – 2013-05-09 17:51:01

+0

@AbhijitBhattacharya - 用'pyparsing'標籤搜索其他問題/答案。您還可以訪問http://pyparsing.wikispace.com上的wiki,並閱讀wiki主頁上的討論選項卡。 – PaulMcG 2013-05-10 13:41:38

回答

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

謝謝。你是對的。我已經得到了它。 – 2013-05-09 18:18:19

+0

沒問題,歡迎來到Stack Overflow!通常該協議是upvote有用的答案和「接受」解決您的問題的答案。 – Hooked 2013-05-09 18:20:32

+0

我已經更新了答案,以在語法中顯示不同的方法。 – Hooked 2013-05-09 18:23:11