Unicode空白是否有Python常量?

栏目: Python · 发布时间: 6年前

内容简介:代码日志版权声明:翻译自:http://stackoverflow.com/questions/37903317/is-there-a-python-constant-for-unicode-whitespace
字符串模块包含一个空格属性,它是一个由所有被认为是空格的ASCII字符组成的字符串.还有一个相应的常数,包括Unicode空间,如 no-break space (U+00A0) ?我们可以从问题“ strip() and strip(string.whitespace) give different results ”中看到,至少strip已经知道了额外的Unicode空格字符.

这个问题被确定为 Python -how-to-list-all-characters-matched-by-posix-extended-regex-space?lq=1″>

In Python, how to list all characters matched by POSIX extended regex [:space:] ?的副本,但该问题的答案确定了搜索空格字符来生成自己的列表的方法.这是一个耗时的过程.我的问题就是一个常数.

Is there a Python constant for Unicode whitespace?

简短的答案:不,我在 Python 代码库中个人对这些字符(特别是数字代码点)进行了grepped,而且这个常量不存在.

下面的部分说明为什么它不是必需的,以及如何在没有这些信息作为常数的情况下实现它.但是有这样一个常数也是一个非常糟糕的主意.

如果Unicode Consortium添加了语义空格的另外一个字符/代码点,那么Python的维护者在继续支持语义不正确的代码或者改变可能(不当地)做出假设的常量和可能的破坏的现有代码之前,选择不好关于常数不变.

如何添加这些字符代码点? Unicode中有1,111,998个可能的字符.但截至 version 8 ,只有120,672个被占用.每个新版本的Unicode可能会添加其他字符.这些新角色之一可能是一种空白形式.

信息存储在动态生成的C函数中

确定unicode中什么是空格的代码是以下动态生成的 code .

# Generate code for _PyUnicode_IsWhitespace()
print("/* Returns 1 for Unicode characters having the bidirectional", file=fp)
print(" * type 'WS', 'B' or 'S' or the category 'Zs', 0 otherwise.", file=fp)
print(" */", file=fp)
print('int _PyUnicode_IsWhitespace(const Py_UCS4 ch)', file=fp)
print('{', file=fp)
print('    switch (ch) {', file=fp)
for codepoint in sorted(spaces):
    print('    case 0x%04X:' % (codepoint,), file=fp)
print('        return 1;', file=fp)
print('    }', file=fp)
print('    return 0;', file=fp)
print('}', file=fp)
print(file=fp)

这是一个switch语句,它是一个常量的代码块,但是这个信息不像模块“constant”那样可用.它被埋在从C编译的函数中,而不是直接从Python访问.

这可能是因为将更多的代码点添加到Unicode中,因为向后兼容性原因,我们将无法更改常量.

生成的代码

以下是当前生成的代码 at the tip

int _PyUnicode_IsWhitespace(const Py_UCS4 ch)
{
    switch (ch) {
    case 0x0009:
    case 0x000A:
    case 0x000B:
    case 0x000C:
    case 0x000D:
    case 0x001C:
    case 0x001D:
    case 0x001E:
    case 0x001F:
    case 0x0020:
    case 0x0085:
    case 0x00A0:
    case 0x1680:
    case 0x2000:
    case 0x2001:
    case 0x2002:
    case 0x2003:
    case 0x2004:
    case 0x2005:
    case 0x2006:
    case 0x2007:
    case 0x2008:
    case 0x2009:
    case 0x200A:
    case 0x2028:
    case 0x2029:
    case 0x202F:
    case 0x205F:
    case 0x3000:
        return 1;
    }
    return 0;
}

让自己不断变化:

Python 3中的以下代码(从我的答案 here )生成一个所有空格的常量:

import re
import sys

s = ''.join(chr(c) for c in range(sys.maxunicode+1))
ws = ''.join(re.findall(r'\s', s))

作为优化,您可以将其存储在代码库中,而不是在每个新进程中自动生成代码,但我谨防止假定它永远不会改变.

>>> ws
'\t\n\x0b\x0c\r\x1c\x1d\x1e\x1f \x85\xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000'

(链接的问题的其他答案显示如何获得Python 2.)

记住,有一点,有些人可能认为256字符编码是我们所需要的.

>>> import string
>>> string.whitespace
' \t\n\r\x0b\x0c'

如果您坚持在代码库中保持不变,只需为您的Python版本生成常量,并将其存储为文字:

unicode_whitespace = u'\t\n\x0b\x0c\r\x1c\x1d\x1e\x1f \x85\xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000'

u前缀使它在Python 2中是unicode(2.7恰好将上面的整个字符串识别为空格),在Python 3中,默认情况下,字符串字面值为unicode将被忽略.

代码日志版权声明:

翻译自:http://stackoverflow.com/questions/37903317/is-there-a-python-constant-for-unicode-whitespace


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Art of Computer Programming, Volume 3

The Art of Computer Programming, Volume 3

Donald E. Knuth / Addison-Wesley Professional / 1998-05-04 / USD 74.99

Finally, after a wait of more than thirty-five years, the first part of Volume 4 is at last ready for publication. Check out the boxed set that brings together Volumes 1 - 4A in one elegant case, and ......一起来看看 《The Art of Computer Programming, Volume 3》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具