2012-01-19 10 views
26

अजगर में रिक्त स्थान से तार विभाजित करने के लिए, एक आम तौर पर पैरामीटर के बिना तार का split विधि का उपयोग करता:पायथन: सभी जगह पात्रों द्वारा बंटवारे स्ट्रिंग

>>> 'a\tb c\nd'.split() 
['a', 'b', 'c', 'd'] 

लेकिन कल मैं एक स्ट्रिंग है ZERO WIDTH SPACE इस्तेमाल किया शब्दों के बीच के रूप में भर में भाग गया कुंआ। (जावास्क्रिप्ट लोगों के बीच में) एक छोटी black magic प्रदर्शन में अपने नए ज्ञान दिया, मैं, सभी whitespace characters से पूछने के लिए कैसे बेहतर विभाजित करने के लिए के बाद से split पर्याप्त नहीं है चाहते हैं:

>>> u'a\u200bc d'.split() 
[u'a\u200bc', u'd'] 

UPD1

ऐसा लगता है कि sth जेरेरल काम करता है लेकिन कुछ ओएस सेटिंग्स या पायथन संकलन विकल्पों पर निर्भर करता है। निश्चित रूप से कारण जानना अच्छा लगेगा (और अगर सेटिंग विंडोज़ पर स्विच की जा सकती है)।

तो मैं मुद्दे के बारे में यूनिकोड तकनीकी समिति से संपर्क किया और एक तुरंत एक प्रतिक्रिया वापस प्राप्त प्राप्त किया:

UPD2 cptphil एक महान link सब कुछ स्पष्ट करता है कि पाया। उन्होंने बताया कि ZWSP था एक समय सफेद स्थान माना जाता पर एक बार, लेकिन वह unicode site से यूनिकोड 4.0.1

एक उद्धरण में बदला गया था:

Zs से U + 200B शून्य चौड़ाई रिक्ति बदलने सीएफ (2003.10.27)

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

प्रस्ताव यू + 200 बी की सामान्य श्रेणी को जेड से सीएफ तक बदलना है।

संकल्प: बंद। यूनिकोड संस्करण 4.0.1 में यू + 200 बी की सामान्य श्रेणी जेड से सीएफ में बदल दी जाएगी।

परिवर्तन तब पाइथन में दिखाई देता था। पायथन 2.5.4 और 2.6.5 में u'\u200B'.isspace() का परिणाम पायथन 2.7.1 में True है, यह पहले से ही False है।

नियमित split अन्य अंतरिक्ष पात्रों के लिए पर्याप्त है:

>>> u'a\u200Ac'.split() 
[u'a', u'c'] 

और अगर है कि आप के लिए पर्याप्त नहीं है, पात्रों द्वारा एक जोड़ने एक Gabi Purcaru नीचे के रूप में पता चलता है।

+1

मेरी मशीन पर 'u'a \ u200bc डी .split()' 'रिटर्न [u'a ', u'c', u'd ' ] '। यह उबंटू पर पायथन 2.6.5 का उपयोग कर रहा है। – NPE

+1

@aix: यह '[u'a \ u200bc', u'd ']' यहां लौटाता है (आर्क लिनक्स पर पायथन 2.7.2)। यूएस लोकेल –

+0

@aix, हम्म, दिलचस्प! – newtover

उत्तर

17

संपादित

यह पता चला है कि \ u200b तकनीकी रूप से व्हाइटस्पेस के रूप में परिभाषित नहीं किया गया है, और इसलिए पाइथन इसे यूनिकोड ध्वज के साथ मिलान करने के रूप में भी पहचानता नहीं है। तो इसे एक गैर-सफेद जगह के रूप में माना जाना चाहिए।

http://en.wikipedia.org/wiki/Whitespace_character#Unicode

http://bugs.python.org/issue13391

import re 

re.split(ur"[\u200b\s]+", "some string", flags=re.UNICODE) 
+0

लिंक के लिए धन्यवाद! – newtover

+0

यहां है जहां '\ s' दस्तावेज किया गया है https://docs.python.org/2/howto/regex.html –

2

आप 'फिर से' मॉड्यूल एक विभाजक 'विभाजित' करने के लिए इस्तेमाल करते हैं और पारित कर सकते हैं: http://docs.python.org/library/re.html#re.split

+0

इस तरह से मैं एक सेपरेटर पास कर सकता हूं, उनमें से कोई समूह नहीं – newtover

+0

यह ओपी की मदद नहीं करेगा क्योंकि आप केवल * एक * विभाजक स्ट्रिंग निर्दिष्ट कर सकते हैं, सभी संभावित व्हाइटस्पेस वर्णों की सूची नहीं। 'sep' तर्क के साथ 'विभाजन()' तर्क के बिना काफी अलग व्यवहार करता है, विवरण के लिए अपना लिंक देखें। –

+0

क्षमा करें, मैंने 'पुनः' के बजाय 'str' दस्तावेज़ लिंक चिपकाया - निश्चित;) –

6

आप सक्षम यूनिकोड मिलान के साथ रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं:

>>> re.split(r'(?u)\s', u'a\u200bc d') 
[u'a', u'c', u'd'] 
+1

ऐसा लगता है, आप (और @aix) में सेटिंग्स में कुछ है जो मेरे पास नहीं है! मेरा मतलब है कि विंडोज 7 पर काम नहीं करता है। – newtover

+0

हालांकि यह एक फ्रीबीएसडी पर काम करता है! – newtover

4

आप re.split उपयोग कर सकते हैं, जैसे इस:

import re 
re.split(u'\s|\u200b', your_string) 
+0

मैं उन्हें सभी नाम नहीं देना चाहूंगा = ( – newtover

+0

अच्छी तरह से जाने का सबसे अच्छा तरीका @ sth है, लेकिन अगर यह आपके लिए काम नहीं करता है, तो आपको उन्हें सभी नाम देना पड़ सकता है (यदि, ज़ाहिर है, आपको नहीं मिला बाहर क्यों उनके समाधान काम नहीं कर रहे हैं) –

2

आप कुछ इस तरह का उपयोग कर सकते हैं?

re.split(r'\s+', your_string, re.UNICODE) 
2

बस का उपयोग split:

>>> u'\u200b'.isspace() 
True 
+0

जैसा कि आप उदाहरण से देख सकते हैं प्रश्न का पाठ, जो हमेशा काम नहीं करता है। – newtover

+0

+1 मुझे 'जारीस्थान' विधि के बारे में जानने के लिए +1 =) – newtover

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