2011-08-12 9 views
5

के साथ गैर लालची पार्सिंग मैं पाइपर्सिंग के साथ एक रेखा को पार्स करने की कोशिश कर रहा हूं। यह रेखा कई (कुंजी, मान) से बना है। मैं क्या प्राप्त करना चाहता हूं (कुंजी, मान) की एक सूची है। एक साधारण उदाहरण: [('ids', '12'), ('fields', 'name')]पाइपर्सिंग

एक अधिक जटिल उदाहरण:

ids = 12 fields = name 

की तरह कुछ में परिणाम चाहिए [('ids', '12, 13, 14'), ('fields', 'name, title')]

पुनश्च:: टपल अंदर

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

की तरह कुछ में परिणाम चाहिए परिणामी सूची सिर्फ एक उदाहरण है। यह एक dict या एक और सूची हो सकता है या जो भी हो, यह महत्वपूर्ण नहीं है। [('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+', ') 

यह पता चलता है कि किसी भी भाग अक्षरांकीय अनुक्रम, शाब्दिक ', ' के बाद से मेल खाता है, लेकिन इसके बजाय यह अक्षरांकीय वर्ण, ',' और ' ' के किसी भी क्रम से मेल खाता है।

क्या आप के बजाय चाहते हैं है:

gr = P.Group(key_equal+val) 

इसके बजाय, आप यथासंभव अधिक से अधिक पार्स चाहिए:

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

दूसरी समस्या यह है कि आप केवल एक कुंजी-मान पेयर पार्स है:

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

तो सही समाधान है:

0,123,
>>> 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

पीएस: आपकी पोस्ट को थोड़ा संपादित किया गया। मुझे आपके समाधान के साथ बेहतर परिणाम मिलता है। समस्या यह है कि मुझे केवल पहला भाग मिलता है, न कि निम्नलिखित भागों में। मुझे मिलता है [('आईडी', '12, 13,14 ')]। मैं [('ids', '12, 13,14 ') प्राप्त करना चाहता हूं, (' फ़ील्ड ',' नाम, शीर्षक ')] – Oli

+0

@ ओली: पकड़ के लिए धन्यवाद। मैंने आपकी दूसरी समस्या का समाधान जोड़ा। – blubb

+0

बहुत बहुत धन्यवाद। वास्तव में मुझे क्या चाहिए। – Oli

संबंधित मुद्दे