2010-04-08 15 views
8

मैं न्यूलाइन अक्षरों (विंडोज़, ओएस एक्स, और यूनिक्स टेक्स्ट फ़ाइल न्यूलाइन अक्षरों के लिए खानपान) पर एक स्ट्रिंग को विभाजित करने की कोशिश कर रहा हूं। यदि इनमें से कोई उत्तराधिकार है, तो मैं उस पर भी विभाजित करना चाहता हूं और परिणाम में कोई शामिल नहीं करना चाहता हूं।रेगेक्स न्यूलाइन अक्षरों के उत्थान पर विभाजित करने के लिए

तो, के लिए बंटवारे जब निम्न:

"Foo\r\n\r\nDouble Windows\r\rDouble OS X\n\nDouble Unix\r\nWindows\rOS X\nUnix" 

परिणाम होगा:

['Foo', 'Double Windows', 'Double OS X', 'Double Unix', 'Windows', 'OS X', 'Unix'] 

मैं क्या regex का उपयोग करना चाहिए?

+3

आप अन्य खड़ी खाली स्थान के बारे में चिंतित हैं? \ r \ n डॉस है, लेकिन अभी भी लंबवत टैब और यूनिकोड एनबीएसपी, पीएस, एलएस, एनएनबीएसपी जैसे अन्य संभावित वर्टिकल व्हाइटस्पेस हैं। आप यह जांचना चाहेंगे कि पाइथन जेनेरिक न्यूलाइन की अवधारणा का समर्थन करता है या नहीं। पर्ल में \ v और \ R है जो क्रमशः किसी सामान्य जेनेरिक व्हाइटसाइट या लाइनफीड से मेल खाता है। यदि नहीं, तो यदि आप यूनिकोड वर्ण चाहते हैं, तो उनको अपने चरित्र वर्गों में जोड़ें [\ r \ n] + और पाइथन उन यूनिकोड वर्णों को ढूंढने के बराबर। – dawg

उत्तर

6

इस उद्देश्य के लिए सबसे सरल पैटर्न r'[\r\n]+' जो आप के रूप में "एक या अधिक गाड़ी-वापसी या नई पंक्ति वर्ण" उच्चारण कर सकते हैं।

+0

यूप। यह काम करता है। Splitlines के लिए – dawg

1
>>> s="Foo\r\n\r\nDouble Windows\r\rDouble OS X\n\nDouble Unix\r\nWindows\rOS X\nUnix" 
>>> import re 
>>> re.split("[\r\n]+",s) 
['Foo', 'Double Windows', 'Double OS X', 'Double Unix', 'Windows', 'OS X', 'Unix'] 
20

अगर वहाँ शुरू होता है या लाइनों के सिरों पर कोई रिक्त स्थान हैं, तो आप कोई तर्क के साथ line.split() उपयोग कर सकते हैं। यह युगल हटा देगा। । यदि नहीं, तो आप [a for a a.split("\r\n") if a] का उपयोग कर सकते हैं।

संपादित करें: str प्रकार में "स्प्लिटलाइन" नामक एक विधि भी है।

"Foo\r\n\r\nDouble Windows\r\rDouble OS X\n\nDouble Unix\r\nWindows\rOS X\nUnix".splitlines()

+4

+1 –

0

पैटर्न के लिए लालच नियमों पर ध्यान देना:

pattern = re.compile(r'(\r\n){2,}|(\n\r){2,}|(\r){2,}|(\n){2,}') 
paragraphs = pattern.split(text) 
संबंधित मुद्दे