【问题标题】:Python: splitting string by all space charactersPython:用所有空格字符分割字符串
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 这样我可以传递一个分隔符,而不是一组分隔符
  • 这对 OP 没有帮助,因为您只能指定 one 分隔符字符串,而不是所有可能的空白字符的列表。 split()sep 参数的行为与不带参数的行为完全不同,有关详细信息,请参阅您的链接。
  • 抱歉,我粘贴了 'str' 文档链接而不是 're' - 已修复 ;)
  • @kindall:cmets 指的是这个答案的原始版本,大约是str.split,而不是re.split
【解决方案2】:

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

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

【讨论】:

  • 看来,您(和@aix)在设置中有一些我没有的东西!我的意思是这在 Windows 7 上不起作用。
【解决方案3】:

你可以使用re.split,像这样:

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

【讨论】:

  • 我不想一一列举=(
  • 好吧,最好的方法是@sth's,但如果它不适合你,你可能不得不将它们全部命名(当然,如果你不知道为什么他们的解决方案不工作)
【解决方案4】:

编辑

事实证明 \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)

【讨论】:

    【解决方案5】:

    你能用这样的东西吗?

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

    【讨论】:

      【解决方案6】:

      只需使用split:

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

      【讨论】:

      • 从问题文本中的示例可以看出,这并不总是有效。
      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 2013-08-02
      • 2023-04-02
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多