gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:22:28 24 4
gpt4 key购买 nike

我注意到 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 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 ; Unicode 标准中列出的任何代码点,其 Line_Break 属性设置为 BKCRLF NL 或双向类别设置为 B(分段符)被视为换行符。

来自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 或 U+001E 代码点的同一组换行符上拆分您的文本,所以三个 data structuring control characters .

关于Python字符串splitlines()去除某些Unicode控制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24453713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com