【发布时间】:2012-02-14 06:14:09
【问题描述】:
在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。
解决方案:关闭。 U+200B 的通用类别在 Unicode 4.0.1 版本中将由 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']
如果这对您来说还不够,请按照Gabi Purcaru 的建议逐个添加字符。
【问题讨论】:
-
在我的机器上
u'a\u200bc d'.split()返回[u'a', u'c', u'd']。这是在 Ubuntu 上使用 Python 2.6.5。 -
@aix:它在此处返回
[u'a\u200bc', u'd'](Arch Linux 上的 Python 2.7.2)。美国地区。 -
我对此没有任何解释,但为了完整起见,我想我会提到它。哦,同一台机器上的 EPD Python 2.7.1 的行为方式与您描述的方式相同。一定与解释器的构建方式有关。
-
sth 的解决方案不起作用的原因,在它不起作用的情况下,是 \u200b 不是(无论如何被某些人)视为空格,如此处所述:bugs.python.org/issue13391。
标签: python whitespace