Python:按所有空格字符分割字符串
在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 个回答
你可以使用 re.split 这个功能,像这样:
import re
re.split(u'\s|\u200b', your_string)
你可以使用一个正则表达式,并且开启Unicode匹配功能:
>>> re.split(r'(?u)\s', u'a\u200bc d')
[u'a', u'c', u'd']
编辑
结果发现,\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)