2009-11-30 3 views
17

में एक स्ट्रिंग रखने वाले डिलिमिटर को टोकननाइज़ करें, क्या पाइथन में str.split के बराबर कोई भी समतुल्य है जो डिलीमीटर देता है?पायथन

मुझे कुछ टोकन को प्रोसेस करने के बाद मेरे आउटपुट के लिए व्हाइटस्पेस लेआउट को संरक्षित करने की आवश्यकता है।

उदाहरण:

>>> s="\tthis is an example" 
>>> print s.split() 
['this', 'is', 'an', 'example'] 

>>> print what_I_want(s) 
['\t', 'this', ' ', 'is', ' ', 'an', ' ', 'example'] 

धन्यवाद!

+1

+1 - दिलचस्प सवाल है, 'splitlines' एक' keepends' पैरामीटर करने लगता है, लेकिन 'split' के लिए ऐसी कोई बात नहीं। अजीब लगता है (http://docs.python.org/library/stdtypes.html#str.splitlines)। –

उत्तर

19

कैसे

के बारे में
import re 
splitter = re.compile(r'(\s+|\S+)') 
splitter.findall(s) 
+0

सुरुचिपूर्ण और आसानी से विस्तार योग्य (सोचें '(\ s + | \ w + | \ S +) ')। – hop

6
>>> re.compile(r'(\s+)').split("\tthis is an example") 
['', '\t', 'this', ' ', 'is', ' ', 'an', ' ', 'example'] 
4

re मॉड्यूल इस सुविधा प्रदान करता है:

>>> import re 
>>> re.split('(\W+)', 'Words, words, words.') 
['Words', ', ', 'words', ', ', 'words', '.', ''] 

(अजगर प्रलेखन से उद्धृत)।

आपके उदाहरण के लिए (व्हाइटस्पेस पर विभाजित), re.split('(\s+)', '\tThis is an example') का उपयोग करें।

कुंजी रेगेक्स को घेरना है जिस पर कैप्चरिंग कोष्ठक में विभाजित करना है। इस तरह, delimiters परिणामों की सूची में जोड़ा जाता है।

संपादित करें: जैसा कि बताया गया है, किसी भी पूर्व/पिछली डिलीमीटर को भी सूची में जोड़ा जाएगा। इससे बचने के लिए आप पहले अपनी इनपुट स्ट्रिंग पर .strip() विधि का उपयोग कर सकते हैं। re मॉड्यूल के लिए इशारा करते हुए के लिए

+0

ओपी के स्ट्रिंग मास्क का उपयोग नहीं कर रहा तथ्य यह है कि रिक्त स्ट्रिंग को लौटाई गई सूची के पहले तत्व के रूप में शामिल किया गया है। – hop

+0

धन्यवाद। मैंने तदनुसार अपनी पोस्ट संपादित की (हालांकि इस मामले में, ओपी का नमूना ("व्हाइटस्पेस को संरक्षित करना चाहता है") और उसका उदाहरण विरोधाभासी था)। –

+0

नहीं, यह नहीं था ... वर्तमान व्यवहार का एक उदाहरण था, और वांछित एक और। – fortran

-1

धन्यवाद दोस्तों, मैं अभी भी उस के बीच तय करने की कोशिश कर रहा हूँ और मेरी अपनी समारोह है कि एक दृश्य देता है ...

def split_keep_delimiters(s, delims="\t\n\r "): 
    delim_group = s[0] in delims 
    start = 0 
    for index, char in enumerate(s): 
     if delim_group != (char in delims): 
      delim_group ^= True 
      yield s[start:index] 
      start = index 
    yield s[start:index+1] 

का उपयोग कर अगर मैं समय मैं उन्हें बेंचमार्क चाहते था एक्सडी

+0

यदि आपके पास पाइथन 2.5 है तो कोई रेगेक्स या अपने स्वयं के पहियों को बनाने की ज़रूरत नहीं है .. मेरा जवाब देखें। – ghostdog74

3

क्या आपने पाइपर्सिंग देखा है? उदाहरण the pyparsing wiki से उधार लिया:

>>> from pyparsing import Word, alphas 
>>> greet = Word(alphas) + "," + Word(alphas) + "!" 
>>> hello1 = 'Hello, World!' 
>>> hello2 = 'Greetings, Earthlings!' 
>>> for hello in hello1, hello2: 
...  print (u'%s \u2192 %r' % (hello, greet.parseString(hello))).encode('utf-8') 
... 
Hello, World! → (['Hello', ',', 'World', '!'], {}) 
Greetings, Earthlings! → (['Greetings', ',', 'Earthlings', '!'], {})