Python:按所有空格字符分割字符串

29 投票
6 回答
33861 浏览
提问于 2025-04-17 10:37

在Python中,如果想通过空格来分割字符串,通常可以使用字符串的 split 方法,不传入任何参数:

>>> 'a\tb c\nd'.split()
['a', 'b', 'c', 'd']

不过昨天我遇到了一种字符串,它在单词之间使用了零宽空格。我把这个新知识运用到了一些黑魔法的表演中(在JavaScript圈子里),所以我想问问,如何更好地分割所有的空白字符,因为单靠 split 方法是不够的:

>>> u'a\u200bc d'.split()
[u'a\u200bc', u'd']

更新1

看起来 sth 提出的解决方案通常是有效的,但它依赖于一些操作系统的设置或Python的编译选项。想知道具体原因(以及在Windows中是否可以更改这个设置)会很好。

更新2

cptphil 找到了一个很棒的链接,让一切变得清晰:

所以我联系了Unicode技术委员会,询问这个问题,并很快得到了回复。他们指出,零宽空格曾经被认为是空白字符,但在Unicode 4.0.1中这个定义被改变了。

以下是来自unicode网站的引用:

将U+200B零宽空格的类别从Zs改为Cf(2003.10.27)

使用U+200B零宽空格(ZWSP)一直存在持续的问题。这个字符的功能是允许在通常不允许的地方换行,因此它实际上是一个格式字符,属于Cf类别。这个行为在Unicode标准中有详细的记录,而这个字符在Unicode字符数据库中并不被视为空白字符。然而,出于历史原因,它的类别仍然是Zs(空格分隔符),这导致了这个字符的误用。ZWSP也是唯一一个不是空白的Zs字符。这个类别可能会导致对规则D13基础字符的误解,认为ZWSP可以作为组合标记的基础。

提议是将U+200B的类别从Zs改为Cf。

解决方案:已关闭。U+200B的类别将在Unicode版本4.0.1中从Zs改为Cf。

这个变化随后在Python中得到了反映。在Python 2.5.4和2.6.5中,u'\u200B'.isspace() 的结果是 True,而在Python 2.7.1中,它的结果已经是 False

对于其他空白字符,普通的 split 方法就足够了:

>>> u'a\u200Ac'.split()
[u'a', u'c']

如果这还不够,你可以像 Gabi Purcaru 在下面建议的那样,逐个添加字符。

6 个回答

4

你可以使用 re.split 这个功能,像这样:

import re
re.split(u'\s|\u200b', your_string)
6

你可以使用一个正则表达式,并且开启Unicode匹配功能:

>>> re.split(r'(?u)\s', u'a\u200bc d')
[u'a', u'c', u'd']
18

编辑

结果发现,\u200b 这个字符在技术上并不被定义为空白字符,因此即使在使用unicode标志的情况下,Python也不会把它当作 \s 来匹配。所以它必须被视为一个非空白字符。

http://en.wikipedia.org/wiki/Whitespace_character#Unicode

http://bugs.python.org/issue13391

import re

re.split(ur"[\u200b\s]+", "some string", flags=re.UNICODE)

撰写回答