[英]Python string splitlines() removes certain Unicode control characters
我注意到Python的標准字符串方法splitlines()實際上也刪除了一些關鍵的Unicode控制字符。 例
>>> s1 = u'asdf \n fdsa \x1d asdf'
>>> s1.splitlines()
[u'asdf ', u' fdsa ', u' asdf']
注意“\\ x1d”字符是如何悄然消失的。
如果字符串s1仍然是Python字節串(沒有“u”前綴),則不會發生這種情況:
>>> 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(29))之外的其他字符會受到什么影響?
我在Ubuntu 12.04 LTS上使用Python 2.7.3。
這確實沒有記錄; 我不得不仔細挖掘源代碼才能找到它。
unicodetype_db.h
文件將換行符定義為:
case 0x000A:
case 0x000B:
case 0x000C:
case 0x000D:
case 0x001C:
case 0x001D:
case 0x001E:
case 0x0085:
case 0x2028:
case 0x2029:
這些是從Unicode數據庫生成的 ; Unicode標准中列出的任何代碼點, Line_Break
屬性設置為BK
, CR
, LF
或NL
或雙向類別設置為B
(段落Line_Break
)被視為換行符。
從Unicode數據文件中,標准的第6版將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或U + 001E代碼點之外 ,會將文本拆分為同一組換行符,因此三個數據結構控制字符 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.