要在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
建议逐个添加字符。
答案 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