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

时间:2012-01-19 15:20:15

标签: python whitespace

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

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

但昨天我遇到了一个在单词之间使用ZERO WIDTH SPACE的字符串。我已经将我的新知识转换为简短的black magic性能(在JavaScript人员中),我想问一下如何更好地分割所有whitespace characters,因为split还不够:

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

UPD1

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

UPD2 cptphil发现了一个很棒的link,可以清楚地说明一切:

  

所以我就此问题与Unicode技术委员会联系,并收到了回复的及时回复。他们指出,ZWSP曾经被认为是白色空间,但在Unicode 4.0.1中已经改变了

来自unicode site的引文:

  

将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中。 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 个答案:

答案 0 :(得分: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)

答案 1 :(得分:6)

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

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

答案 2 :(得分:4)

您可以使用re.split,如下所示:

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

答案 3 :(得分:2)

您可以使用're'模块并将分隔符传递给'split':http://docs.python.org/library/re.html#re.split

答案 4 :(得分:2)

你能用这样的东西吗?

re.split(r'\s+', your_string, re.UNICODE)

答案 5 :(得分:2)

只需使用split

>>> u'\u200b'.isspace()
True