2014-06-27 7 views
5

मैंने देखा कि पायथन की मानक स्ट्रिंग विधि स्प्लिटलाइन() वास्तव में कुछ महत्वपूर्ण यूनिकोड नियंत्रण वर्णों को भी हटा देती है। उदाहरणपायथन स्ट्रिंग स्प्लिटललाइन() कुछ यूनिकोड नियंत्रण वर्ण हटाता है

>>> s1 = u'asdf \n fdsa \x1d asdf' 
>>> s1.splitlines() 
[u'asdf ', u' fdsa ', u' asdf'] 

ध्यान दें कि "\ x1d" वर्ण चुपचाप गायब हो जाता है।

यदि स्ट्रिंग एस 1 अभी भी एक अजगर bytestring हालांकि ("यू" उपसर्ग के बिना) है यह नहीं होता है:

>>> s2 = 'asdf \n fdsa \x1d asdf' 
>>> s2.splitlines() 
['asdf ', ' fdsa \x1d asdf'] 

मैं संदर्भ https://docs.python.org/2.7/library/stdtypes.html#str.splitlines में इस बारे में कोई जानकारी नहीं मिल रहा।

ऐसा क्यों होता है? "\ X1d" (या unichr (2 9)) से अन्य वर्ण क्या प्रभावित होते हैं?

मैं उबंटू 12.04 एलटीएस पर पायथन 2.7.3 का उपयोग कर रहा हूं।

उत्तर

8

यह वास्तव में नीचे प्रलेखित है; मुझे इसे खोजने के लिए कुछ हद तक स्रोत कोड खोदना पड़ा।

unicodetype_db.h file रूप लाइनब्रेक परिभाषित करता है:

case 0x000A: 
case 0x000B: 
case 0x000C: 
case 0x000D: 
case 0x001C: 
case 0x001D: 
case 0x001E: 
case 0x0085: 
case 0x2028: 
case 0x2029: 

ये हैं generated from the Unicode database; B (पैराग्राफ विच्छेद) को BK, CR, LF या NL करने के लिए या द्विदिश श्रेणी सेट के साथ Line_Break संपत्ति सेट के साथ यूनिकोड मानक में सूचीबद्ध किसी भी कोडपॉइंट एक लाइन ब्रेक माना जाता है।

Unicode Data file, version 6 of the standard सूचियों U + 001D एक पैराग्राफ विच्छेद के रूप में से

:

001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;; 

(5 वीं स्तंभ द्विदिश श्रेणी है)।

आप रेगुलर एक्सप्रेशन का उपयोग कर सकता है अगर आप क्या पात्रों को विभाजित करने पर सीमित करना चाहते हैं:

import re 

linebreaks = re.compile(ur'[\n-\r\x85\u2028\u2929]') 
linebreaks.split(yourtext) 

U + 001C के लिए छोड़कर लाइनब्रेक के एक ही सेट पर अपने पाठ को विभाजित होता है, U + 001D या यू +001 ई कोडपॉइंट्स, तो तीन data structuring control characters

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