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 字符