2008-09-22 15 views
22

मैं इस तरह की स्ट्रिंग लेने के लिए सक्षम होना चाहिए:मैं एक अल्पविराम सीमांकित स्ट्रिंग को एक सूची (चेतावनी) में कैसे पार्स कर सकता हूं?

'''foo, bar, "one, two", three four''' 

में:

['foo', 'bar', 'one, two', 'three four'] 

मैं एक लग रहा है कि समाधान shlex मॉड्यूल शामिल हो रहा है (#python से संकेत के साथ) है ।

उत्तर

24

श्लेक्स मॉड्यूल समाधान उद्धरण उद्धरण, एक उद्धरण दूसरे से बचने की अनुमति देता है, और सभी फैंसी सामान खोल समर्थन करता है।

>>> import shlex 
>>> my_splitter = shlex.shlex('''foo, bar, "one, two", three four''', posix=True) 
>>> my_splitter.whitespace += ',' 
>>> my_splitter.whitespace_split = True 
>>> print list(my_splitter) 
['foo', 'bar', 'one, two', 'three', 'four'] 

बच गए उद्धरण उदाहरण:

>>> my_splitter = shlex.shlex('''"test, a",'foo,bar",baz',bar \xc3\xa4 baz''', 
           posix=True) 
>>> my_splitter.whitespace = ',' ; my_splitter.whitespace_split = True 
>>> print list(my_splitter) 
['test, a', 'foo,bar",baz', 'bar \xc3\xa4 baz'] 
+1

यह तीन और चार को विभाजित करता है, जो विनिर्देशन में नहीं है। –

+0

अंतिम "तीन चार" को विभाजित करने के लिए एक फिक्स की आवश्यकता है। – tzot

+3

बस my_splitter.whitespace + = ',' to = 'को बदल रहा है,' यह करेगा, लेकिन आपको अभी भी प्रत्येक तत्व को पट्टी करने की आवश्यकता है। –

5

आप csv मॉड्यूल पर भी विचार करना चाहेंगे। मैंने कोशिश नहीं की है, लेकिन ऐसा लगता है कि आपका इनपुट डेटा शेल सिंटैक्स (जो श्लेक्स पार्स है) की तुलना में सीएसवी के करीब है।

+0

सहमत हुए। माइनस संलग्न '' 'भाग, जो कि मानक मानक सीएसवी स्वरूपण की तरह दिखता है। (ठीक है, जितना संभव हो, सीएसवी मानक के बिना।) – jdmichal

+0

@jdmichal: '' 'पायथन में तारों को उद्धृत करने का एक तरीका है। – tzot

1

आप कुछ इस तरह कर सकता है:

>>> import re 
>>> pattern = re.compile(r'\s*("[^"]*"|.*?)\s*,') 
>>> def split(line): 
... return [x[1:-1] if x[:1] == x[-1:] == '"' else x 
...   for x in pattern.findall(line.rstrip(',') + ',')] 
... 
>>> split("foo, bar, baz") 
['foo', 'bar', 'baz'] 
>>> split('foo, bar, baz, "blub blah"') 
['foo', 'bar', 'baz', 'blub blah'] 
-2

यह बहुत होने की जरूरत नहीं है, तो यह अपने रास्ते पर आपको मिल सकता है:

def f(s, splitifeven): 
    if splitifeven & 1: 
     return [s] 
    return [x.strip() for x in s.split(",") if x.strip() != ''] 

ss = 'foo, bar, "one, two", three four' 

print sum([f(s, sie) for sie, s in enumerate(ss.split('"'))], []) 
39

यह निर्भर करता है कि कैसे जटिल आप करना चाहते हैं प्राप्त करें ... क्या आप एक से अधिक प्रकार के उद्धरण की अनुमति देना चाहते हैं। उद्धरण उद्धरण के बारे में कैसे?

आपका वाक्य रचना आम CSV फ़ाइल स्वरूप है, जो अजगर मानक पुस्तकालय द्वारा समर्थित है की तरह बहुत ज्यादा लग रहा है:

import csv 
reader = csv.reader(['''foo, bar, "one, two", three four'''], skipinitialspace=True) 
for r in reader: 
    print r 

आउटपुट:

['foo', 'bar', 'one, two', 'three four'] 

HTH!

+1

हाँ, सीएसवी मॉड्यूल पूरी तरह से आप यहां क्या चाहते हैं। –

+3

बस इसका परीक्षण किया और यह एक इलाज करता है। श्लेक्स मॉड्यूल की तुलना में अधिक सरल वाक्यविन्यास, इसलिए यह मेरा वोट प्राप्त करता है! – DaGaMs

+0

अच्छा सरल समाधान upvoted। – PythonTester

0

मैं कहना चाहता हूँ के लिए रेगुलर एक्सप्रेशन होगा तुम यहाँ क्या खोज रहे हैं, हालांकि मैं बहुत पायथन के Regex इंजन से परिचित नहीं हूँ।

मान लीजिए कि आप आलसी मैचों का उपयोग करते हैं, तो आप एक स्ट्रिंग पर मैचों का एक सेट प्राप्त कर सकते हैं जिसे आप अपनी सरणी में डाल सकते हैं।

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

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