繁体   English   中英

Python字符串splitlines()删除某些Unicode控制字符

[英]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属性设置为BKCRLFNL或双向类别设置为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM