Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中获得UTF-8中的所有空格?_Python_Utf 8_Python 2.7 - Fatal编程技术网

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

如何在Python中获得UTF-8中的所有空格?,python,utf-8,python-2.7,Python,Utf 8,Python 2.7,可能重复: 如何在Python中获得UTF-8中所有空白的列表?包括不间断空格等。我使用的是python 2.7。unicode数据库中的正式空格字符列表是通过“Zs”类别定义的: 我不确定Python的Unicode数据模块中是否有功能。我怀疑:您可以查看所有字符并对照“Zs”检查其类别。将告诉您任何给定字符的类别代码;所需的字符具有codeZs。除了迭代所有字符外,似乎并没有任何方法可以提取类别中的字符列表: >>> for c in xrange(sys.maxuni

可能重复:


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

unicode数据库中的正式空格字符列表是通过“Zs”类别定义的:

我不确定Python的Unicode数据模块中是否有功能。我怀疑:您可以查看所有字符并对照“Zs”检查其类别。

将告诉您任何给定字符的类别代码;所需的字符具有code
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
(注意:如果使用Python 3.4或更高版本进行此测试,蒙古语元音分隔符将不会出现在列表中。Python 2.7附带了Unicode 5.2中的数据;此字符被重新分类为通用类别Cf(“格式控制”)在Unicode 6.3中,这是Python 3.4用于其数据的版本。有关可能需要的更多详细信息,请参阅和。)

您可能还希望包括类别
Zl
Zp
,这会增加

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下一行
几乎从未在野外遇到过它的官方含义;这很可能是由于从Windows-1252到UTF-8的
U+2026水平省略号的错误转换造成的

一个密切相关的问题是“Python正则表达式中的
\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+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+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
U+202F NARROW NO-BREAK SPACE
U+205F MEDIUM MATHEMATICAL SPACE
U+3000 IDEOGRAPHIC SPACE
>s=re.compile(ru“^\s$”,re.UNICODE)
>>>对于范围内的c(sys.maxunicode+1):
...   u=unichr(c)
...   如果s.匹配(u):
...      sys.stdout.write(“U+{:04X}{}\n”.format(
…c,unicodedata.名称(u,“”)
U+0009
U+000A
U+000B
U+000C
U+000D
U+001C
U+001D
U+001E
U+001F
U+0020空间
U+0085
U+00A0不间断空间
U+1680奥格姆空间标记
U+180E蒙古语元音分隔符
U+2000四元
U+2001 EM四元
U+2002 EN空间
U+2003电磁空间
U+2004每EM三个空间
U+2005每EM四个空间
U+2006每EM空间6个
U+2007图形空间
U+2008标点符号空间
U+2009精简空间
U+200A头发空间
U+2028线路分离器
U+2029段落分隔符
U+202F窄不间断空间
U+205F介质数学空间
U+3000表意空间
(我不知道为什么
unicodedata.name
不知道控制字符的名称。同样,如果使用Python 3.4或更高版本进行此测试,蒙古语元音分隔符将不会出现在列表中。)


这是所有的
Z*
字符,所有的
Cc
字符,通常被认为是空白,以及五个额外的字符,通常不被认为是空白,U+001C、U+001D、U+001E、U+001F和U+0085。包含最后一组是一个bug,但在很大程度上是无害的,因为将这些字符用于任何事情都是一个bug。

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))
输出
你说的“空白列表”是什么意思?我想这个问题应该能回答你的问题:对于ASCII,它是
字符串。空白
。你指的是unicode码点,对吗?UTF-8只是一种编码。Unicode正则表达式可以处理用于空白的不同类别:@Mechanicalsnail将U+001C到U+001F视为空白,我知道他们为什么这样做,这可能是无害的,但仍然是错误的。基于上述原因,将U+0085视为空白是完全错误的。(IMNSHO现在唯一有意义的控制字符的方法是根据Windows-1252定义重新分配U+0080到U+009F,即使在处理其他编码时也是如此,并将U+0000..U+0008、U+000E..U+001F和U+007F视为文件损坏的指示。)的确,NEL通常是一个错误,但是,“CR、LF、CRLF和NEL在输入和解释时应被视为相同。只有在输出时才需要区分它们。Unicode标准包含了许多反映理想世界观的内容。如果你在现实生活中这样做,你将无法正确处理人们的文档。例如,请注意,如何在枚举中不包括NEL,以及如何明确要求将编码声明为ISO 8859.1的文档解释为Windows-1252。(我承认我的立场更为激烈。)@Zack:如果你在Unicode字符串中遇到了NEL,那么你应该将其视为空白(至少Perl、Python正则表达式引擎是这样做的)。在实践中,这是非常罕见的,它可能指向错误解码的文本。您应该修复解码过程,而不是更改正则表达式的含义。
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