2011-01-14 7 views
7

पायथन में, मैं विभाजक की सूची का उपयोग करके एक स्ट्रिंग को विभाजित करना चाहता हूं। विभाजक या तो अल्पविराम या अर्धविराम हो सकते हैं। व्हाइटस्पेस को तब तक हटाया जाना चाहिए जब तक यह गैर-व्हाइटस्पेस, गैर-विभाजक पात्रों के बीच में न हो, जिस स्थिति में इसे संरक्षित किया जाना चाहिए।पायथन: विभाजक की सूची द्वारा स्प्लिट स्ट्रिंग

टेस्ट मामले 1: ABC,DEF123,GHI_JKL,MN OP
टेस्ट मामले 2: ABC;DEF123;GHI_JKL;MN OP
टेस्ट मामले 3: ABC ; DEF123,GHI_JKL ; MN OP

नियमित अभिव्यक्ति के लिए एक मामला है, जो ठीक है की तरह लगता है, लेकिन अगर यह आसान या क्लीनर है यह एक और तरीका है करने के लिए यह भी बेहतर होगा।

धन्यवाद!

उत्तर

15

यह बहुत तेजी से तो regex होना चाहिए और आप के रूप में आप चाहते थे seperators की एक सूची पारित कर सकते हैं:

def split(txt, seps): 
    default_sep = seps[0] 

    # we skip seps[0] because that's the default seperator 
    for sep in seps[1:]: 
     txt = txt.replace(sep, default_sep) 
    return [i.strip() for i in txt.split(default_sep)] 

इसका उपयोग कैसे करें:

>>> split('ABC ; DEF123,GHI_JKL ; MN OP', (',', ';')) 
['ABC', 'DEF123', 'GHI_JKL', 'MN OP'] 

प्रदर्शन परीक्षण:

import timeit 
import re 


TEST = 'ABC ; DEF123,GHI_JKL ; MN OP' 
SEPS = (',', ';') 


rsplit = re.compile("|".join(SEPS)).split 
print(timeit.timeit(lambda: [s.strip() for s in rsplit(TEST)])) 
# 1.6733491150007467 

print(timeit.timeit(lambda: split(TEST, SEPS))) 
# 1.6442800510003508 
+1

बहुत अच्छा। इसे सबसे अच्छा जवाब के रूप में चुनना है। सबको शुक्रीया! – blah238

+0

SO व्हाइटस्पेस को कॉम्पैक्ट करता है, – fabrizioM

+0

से ऊपर की स्ट्रिंग में लगातार दो से अधिक सफेद जगहें हैं, शुक्र है कि हमेशा कॉमा या सेमीकॉलन होंगे। – blah238

5

नियमित अभिव्यक्ति का उपयोग करना, कोशिश

[s.strip() for s in re.split(",|;", string)] 

या

[t.strip() for s in string.split(",") for t in s.split(";")] 

बिना।

+0

इसके बजाय 're' आयात करने से बचने के लिए स्ट्रिंग के' विभाजन() 'के माध्यम से इसे करें, उदाहरण के लिए '' एबीसी, डीईएफ 123, जीएचआई_जेकेएल, एमएन ओपी 'स्प्लिट (', |; ')' – marcog

+1

@ मैक्रोग: क्या यह स्ट्रिंग को '', ';' '' की सभी क्रियात्मक घटनाओं पर विभाजित नहीं करेगा? –

+0

महान काम करता है !! धन्यवाद :) – blah238

0
>>> re.split('\s*,\s*|\s*;\s*', 'a , b; cdf') 
['a', 'b', 'cdf'] 
0

वें लेना उत्तर के ऊपर, अपने परीक्षण मामलों के साथ, आप नियमित अभिव्यक्ति का उपयोग करना चाहते हैं, और एक या अधिक अलगाव वर्णों का उपयोग करना चाहते हैं। आपके मामले में, अलगाव वर्ण ',', '|', ';' प्रतीत होते हैं और सफेद जगह। अजगर में श्वेत रिक्ति '\ w' है, इसलिए समझ है:

import re 
list = [s for s in re.split("[,|;\W]+", string)] 

मैं जवाब नहीं दे सकते स्वेन को के ऊपर का जवाब है, लेकिन मैं एक या कोष्ठकों में पात्रों में से अधिक पर विभाजित है, और उपयोग करने के लिए की जरूरत नहीं है पट्टी() विधि।

यिक्स, मैंने सही सवाल नहीं पढ़ा ... स्ट्रिप के साथ स्वेन का जवाब काम करता है; मेरा मानना ​​है कि व्हाइटस्पेस एक और अलगाव है।