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

new*_*ver 27 python whitespace

要在python中按空格分割字符串,通常使用split不带参数的字符串方法:

>>> 'a\tb c\nd'.split()
['a', 'b', 'c', 'd']
Run Code Online (Sandbox Code Playgroud)

但是昨天我遇到了一个在单词之间使用ZERO WIDTH SPACE的字符串.将我的新知识转化为短暂的黑魔法表演(在JavaScript人员中),我想问一下如何更好地分割所有空白字符,因为这split还不够:

>>> u'a\u200bc d'.split()
[u'a\u200bc', u'd']
Run Code Online (Sandbox Code Playgroud)

UPD1

似乎sthgererally 建议的解决方案,但取决于一些操作系统设置或Python编译选项.很高兴知道确定的原因(如果可以在Windows中打开设置).

UPD2 cptphil发现了一个很好的链接,使一切都清晰:

所以我就此问题联系了Unicode技术委员会,并收到了回复后立即收到回复.他们指出,ZWSP曾经被认为是白色空间,但在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.

决议:已结束.在Unicode版本4.0.1中,U + 200B的常规类别将从Zs更改为Cf.

然后,这一变化反映在Python中.u'\u200B'.isspace()Python 2.5.4和2.6.5 的结果是True,在Python 2.7.1中已经存在False.

对于其他空间字符,常规split就足够了:

>>> u'a\u200Ac'.split()
[u'a', u'c']
Run Code Online (Sandbox Code Playgroud)

如果这还不够,请按照Gabi Purcaru下面的建议逐个添加字符.

phi*_*est 17

编辑

事实证明,\ u200b在技术上并没有定义为空格,因此即使使用unicode标志,python也不会将其识别为匹配\.所以它必须被视为非空白字符.

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)
Run Code Online (Sandbox Code Playgroud)


sth*_*sth 6

您可以使用启用了Unicode匹配的正则表达式:

>>> re.split(r'(?u)\s', u'a\u200bc d')
[u'a', u'c', u'd']
Run Code Online (Sandbox Code Playgroud)