[英]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.