意外的split()行为Python

时间:2018-10-23 17:22:42

标签: python python-3.x

Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 'Checksum\t\x85\r\n'.split()
['Checksum']

标签后的部分在哪里?

但是,这些按预期工作:

>>> 'Checksum\t\x84\r\n'.split()
['Checksum', '\x84']
>>> 'Checksum\t\x85\r\n'.split('\t')
['Checksum', '\x85\r\n']
>>> 'Checksum\t\x84\r\n'.split('\t')
['Checksum', '\x84\r\n']

在Python 3.6.6上结果相同。

有趣的是,它在Python 2.7.10上运行良好

Python 2.7.10 (default, Aug 17 2018, 17:41:52)
[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 'Checksum\t\x85\r\n'.split()
['Checksum', '\x85']
>>> 'Checksum\t\x84\r\n'.split()
 ['Checksum', '\x84'] 

2 个答案:

答案 0 :(得分:5)

因为它被视为空白:

>>> "\x85".isspace()
True

str.split()(不带参数)会根据所有空格字符删除,拆分时也会删除“空字段”

因此,所有空格字符均已删除。 \x84不是空格,因此保留:

>>> "\x84".isspace()
False

答案 1 :(得分:5)

split()(不带参数)在空格上分割。 \x85是空格;是U+0085 NEXT LINE (NEL)

Python 2版本以您期望的方式工作,因为Python 2 str.split仅计算ASCII空格。如果在Python 2上使用了Unicode字符串,您将看到相同的行为。