2012-10-02 10 views
16

जैसे मामलों में नहीं, मैं एक स्ट्रिंग को अलग-अलग शब्दों में रिक्त स्थान, अल्पविराम और अवधि के अनुसार विभाजित करने के लिए पाइथन re.split() का उपयोग करना चाहता हूं। लेकिन मैं "1,200"["1", "200"] या ["1.2"] में विभाजित होने के लिए ["1", "2"] में विभाजित नहीं करना चाहता हूं।पायथन re.split() रिक्त स्थान, अल्पविराम, और अवधि के अनुसार विभाजित करने के लिए, लेकिन 1,000 या 1.50

उदाहरण

l = "one two 3.4 5,6 seven.eight nine,ten" 

परिणाम ["one", "two", "3.4", "5,6" , "seven", "eight", "nine", "ten"]

उत्तर

37

एक नकारात्मक अग्रदर्शी और एक नकारात्मक lookbehind उपयोग किया जाना चाहिए:

> s = "one two 3.4 5,6 seven.eight nine,ten" 
> parts = re.split('\s|(?<!\d)[,.](?!\d)', s) 
['one', 'two', '3.4', '5,6', 'seven', 'eight', 'nine', 'ten'] 

दूसरे शब्दों में, आप हमेशा \s (सफेद स्थान) से अलग हो गए, और केवल अल्पविराम और अवधि से विभाजित होते हैं यदि वे के बाद नहीं हैं एक अंक सेया (?<!\d) से पहले।

DEMO

संपादित:

> s = "one two 3.4 5,6 seven.eight nine,ten,1.2,a,5" 
> print re.split('\s|(?<!\d)[,.]|[,.](?!\d)', s) 
['one', 'two', '3.4', '5,6', 'seven', 'eight', 'nine', 'ten', '1.2', 'a', '5'] 

यह ["1.2", "a", "5"] में "1.2,a,5" बंट जाएगा: @verdesmarald टिप्पणी के अनुसार, आप निम्नलिखित के बजाय का उपयोग कर सकते हैं।

DEMO

+2

मैं बजाय या, लगता है ओ पी वास्तव में पालन नहीं किया चाहता है * और * दीं, तो यह होना चाहिए '(<\ घ?!) | ([।] [।]? ! \ d) 'नहीं '(? verdesmarald

+0

@verdesmarald: आप वास्तव में सही हो सकते हैं, मैंने अपना उत्तर संपादित करने के लिए इसे संपादित किया है, धन्यवाद। –

3

तो आप रिक्त स्थान, और अल्पविरामों और अवधिओं पर विभाजित करना चाहते हैं जो संख्याओं से घिरे नहीं हैं। यह काम करना चाहिए:

r" |(?<![0-9])[.,](?![0-9])" 
संबंधित मुद्दे

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