如何在Python中获得UTF-8中的所有空格?

时间:2013-01-09 19:37:18

标签: python utf-8 python-2.7

  

可能重复:
  In Python, how to list all characters matched by POSIX extended regex `[:space:]`?

如何在Python中获取UTF-8中所有空格的列表?包括不间断的空间等我正在使用python 2.7。

3 个答案:

答案 0 :(得分:7)

unicodedata.category会告诉您任何给定字符的类别代码;你想要的字符有代码Zs。似乎没有任何方法可以提取类别中的字符列表,除非迭代所有字符:

>>> for c in xrange(sys.maxunicode+1):
...     u = unichr(c)
...     if unicodedata.category(u) == 'Zs':
...         sys.stdout.write("U+{:04X} {}\n".format(c, unicodedata.name(u)))
... 
U+0020 SPACE
U+00A0 NO-BREAK SPACE
U+1680 OGHAM SPACE MARK
U+180E MONGOLIAN VOWEL SEPARATOR
U+2000 EN QUAD
U+2001 EM QUAD
U+2002 EN SPACE
U+2003 EM SPACE
U+2004 THREE-PER-EM SPACE
U+2005 FOUR-PER-EM SPACE
U+2006 SIX-PER-EM SPACE
U+2007 FIGURE SPACE
U+2008 PUNCTUATION SPACE
U+2009 THIN SPACE
U+200A HAIR SPACE
U+202F NARROW NO-BREAK SPACE
U+205F MEDIUM MATHEMATICAL SPACE
U+3000 IDEOGRAPHIC SPACE

您可能还想要添加类别ZlZp,其中添加了

U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR

你几乎肯定想要包含通常被认为是空格的所有ASCII控制字符 - 出于历史原因(我推测),这些字符属于Cc类。

U+0009 CHARACTER TABULATION  ('\t')
U+000A LINE FEED (LF)        ('\n')
U+000B LINE TABULATION       ('\v')
U+000C FORM FEED (FF)        ('\r')
U+000D CARRIAGE RETURN (CR)  ('\f')

其他60多个Cc字符应被视为空格,即使其官方名称使其听起来像是空格。例如,U+0085 NEXT LINE几乎从未在野外遇到其官方意义;它更有可能是从{-1}}的Windows-1252到UTF-8的错误转换的结果。

一个密切相关的问题是“{1}}在Python正则表达式中匹配的内容是什么?”同样,回答这个问题的最佳方法是迭代所有字符:

U+2026 HORIZONTAL ELLIPSIS

(我不知道为什么\s不知道控制字符的名称。)

这是所有>>> s = re.compile(ru"^\s$", re.UNICODE) >>> for c in range(sys.maxunicode+1): ... u = unichr(c) ... if s.match(u): ... sys.stdout.write("U+{:04X} {}\n".format( ... c, unicodedata.name(u, "<name missing>"))) U+0009 <name missing> U+000A <name missing> U+000B <name missing> U+000C <name missing> U+000D <name missing> U+001C <name missing> U+001D <name missing> U+001E <name missing> U+001F <name missing> U+0020 SPACE U+0085 <name missing> U+00A0 NO-BREAK SPACE U+1680 OGHAM SPACE MARK U+2000 EN QUAD U+2001 EM QUAD U+2002 EN SPACE U+2003 EM SPACE U+2004 THREE-PER-EM SPACE U+2005 FOUR-PER-EM SPACE U+2006 SIX-PER-EM SPACE U+2007 FIGURE SPACE U+2008 PUNCTUATION SPACE U+2009 THIN SPACE U+200A HAIR SPACE U+2028 LINE SEPARATOR U+2029 PARAGRAPH SEPARATOR U+202F NARROW NO-BREAK SPACE U+205F MEDIUM MATHEMATICAL SPACE U+3000 IDEOGRAPHIC SPACE 个字符,所有unicodedata.name个字符通常都被认为是空格,而另外五个的字符通常是同意的空白,U + 001C,U + 001D,U + 001E,U + 001F和U + 0085。包含最后一个组是一个错误,但是一个很大程度上无害的错误,因为使用这些字符是一个错误。

答案 1 :(得分:2)

Zs类别可能还不够:

#!/usr/bin/env python
import sys
import unicodedata

import regex # $ pip install regex

for i in xrange(sys.maxunicode + 1):
    u = unichr(i)
    if regex.match(u"[[:space:]]", u):
        try:
            name = unicodedata.name(u)
        except ValueError:
            name = ""
        print("{:9s} {} {}".format(repr(u), unicodedata.category(u), name))

输出

u'\t'     Cc 
u'\n'     Cc 
u'\x0b'   Cc 
u'\x0c'   Cc 
u'\r'     Cc 
u' '      Zs SPACE
u'\x85'   Cc 
u'\xa0'   Zs NO-BREAK SPACE
u'\u1680' Zs OGHAM SPACE MARK
u'\u180e' Zs MONGOLIAN VOWEL SEPARATOR
u'\u2000' Zs EN QUAD
u'\u2001' Zs EM QUAD
u'\u2002' Zs EN SPACE
u'\u2003' Zs EM SPACE
u'\u2004' Zs THREE-PER-EM SPACE
u'\u2005' Zs FOUR-PER-EM SPACE
u'\u2006' Zs SIX-PER-EM SPACE
u'\u2007' Zs FIGURE SPACE
u'\u2008' Zs PUNCTUATION SPACE
u'\u2009' Zs THIN SPACE
u'\u200a' Zs HAIR SPACE
u'\u2028' Zl LINE SEPARATOR
u'\u2029' Zp PARAGRAPH SEPARATOR
u'\u202f' Zs NARROW NO-BREAK SPACE
u'\u205f' Zs MEDIUM MATHEMATICAL SPACE
u'\u3000' Zs IDEOGRAPHIC SPACE

答案 2 :(得分:0)

unicode数据库中的官方空格字符列表是通过&#39; Zs&#39;来定义的。种类:

http://www.fileformat.info/info/unicode/category/Zs/list.htm

我不确定Python的unicodedata模块中是否有功能。我怀疑:你可以查看所有角色,并检查他们的类别对抗&#39; Zs&#39;。