split() 将哪些字符视为空格?

Aas*_*set 14 python cpython python-2.x

我正在移植一些调用split()字符串的Python 2 代码,所以我需要知道它的确切行为。文档指出,当您不指定sep参数时,“连续空格的运行被视为单个分隔符”。

不幸的是,它没有指定将是哪些字符。有一些明显的竞争者(如空格、制表符和换行符),但 Unicode 包含许多其他候选者。

哪些字符被 视为空格split()

由于答案可能是特定于实现的,我的目标是 CPython。

(注意:我自己研究了这个答案,因为我在任何地方都找不到它,所以我会在这里发布它,希望对其他人有益。)

Aas*_*set 17

不幸的是,这取决于您的字符串是 anstr还是 a unicode(至少,在 CPython 中 - 我不知道这种行为是否实际上是由任何地方的规范强制执行的)。

如果是str,答案很简单:

  • 0x09 标签
  • 0x0a 新队
  • 0x0b 垂直标签
  • 0x0c 换页
  • 0x0d 回车
  • 0x20 空间

来源:这些是带有PY_CTF_SPACEin的字符Python/pyctype.c,由 使用,由Py_ISSPACE使用,由STRINGLIB_ISSPACE使用split_whitespace

如果是 a unicode,则有 29 个字符,除上述之外还有:

  • U+001c通过0x001f:文件/组/记录/单位分隔符
  • U+0085: 下一行
  • U+00a0: 不间断空间
  • U+1680: 奥格姆空间标记
  • U+2000通过0x200a:各种固定大小的空间(例如Em Space),但请注意包括零宽度空间
  • U+2028: 行分隔符
  • U+2029: 段落分隔符
  • U+202f: 狭窄的不间断空间
  • U+205f: 中等数学空间
  • U+3000: 表意空间

请注意,前四个也是有效的 ASCII 字符,这意味着仅 ASCII 的字符串可能会根据它是 anstr还是unicode!

来源:这些是 中列出的字符_PyUnicode_IsWhitespace,由 使用,由Py_UNICODE_ISSPACE使用STRINGLIB_ISSPACE(看起来它们对str和使用相同的函数实现unicode,但为每种类型分别编译,某些宏实现不同)。文档字符串对这组字符的描述如下:

具有双向类型“WS”、“B”或“S”或类别“Zs”的 Unicode 字符

  • @awarrier99:“str.split”和“unicode.split”实际上都不使用“string.whitespace”。 (2认同)