2011-08-12 128 views
5

我想解析pyparsing一行。該行由多個(鍵,值)組成。我想得到的是(鍵,值)列表。一個簡單的例子:非貪婪分析與pyparsing

ids = 12 fields = name 

應該導致這樣的:[('ids', '12'), ('fields', 'name')]

更復雜的例子:

ids = 12, 13, 14 fields = name, title 

應該導致這樣的:[('ids', '12, 13, 14'), ('fields', 'name, title')]

PS:裏面的元組結果列表僅僅是一個例子。這可能是一個字典或其他列表或其他,這並不重要。

但是,不管我試圖到現在我得到這樣的結果: [('ids', '12 fields')]

Pyparsing吃下一關鍵,考慮到它也是價值的一部分。

這裏是一個示例代碼:

import pyparsing as P 

key = P.oneOf("ids fields") 
equal = P.Literal('=') 
key_equal = key + equal 
val = ~key_equal + P.Word(P.alphanums+', ') 

gr = P.Group(key_equal+val) 
print gr.parseString("ids = 12 fields = name") 

有人能幫助我嗎?謝謝。

回答

7

的第一個問題就出在這行:

val = ~key_equal + P.Word(P.alphanums+', ') 

這表明一部分任何字母數字序列,然後是文字', '匹配,而是它的字母數字字符,','' '任何序列匹配。

什麼你想要的卻是:

val = ~key_equal + P.delimitedList(P.Word(P.alphanums), ", ", combine=True) 

的第二個問題是,你只分析一個鍵 - 值對:

gr = P.Group(key_equal+val) 

相反,你應該分析儘可能多的:

gr = P.Group(P.OneOrMore(key_equal+val)) 

所以正確的方法是:

>>> import pyparsing as P 
>>> key = P.oneOf("ids fields") 
>>> equal = P.Literal('=') 
>>> key_equal = key + equal 
>>> val = ~key_equal + P.delimitedList(P.Word(P.alphanums), ", ", combine=True) 
>>> gr = P.OneOrMore(P.Group(key_equal+val)) 
>>> print gr.parseString("ids = 12, 13, 14 fields = name, title") 
[['ids', '=', '12, 13, 14'], ['fields', '=', 'name, title']] 
+0

PS:稍微編輯了你的帖子。我的解決方案獲得了更好的結果。問題是我只得到第一部分而不是以下部分。我得到[('ids','12,13,14')]。我想得到[('ids','12,13,14'),('fields','name,title')] – Oli

+0

@Oli:謝謝你的收穫。我爲第二個問題添加了解決方案。 – blubb

+0

非常感謝。正是我需要的。 – Oli