Unicode空白是否有Python常量?

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

内容简介:代码日志版权声明:翻译自: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


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

查看所有标签

猜你喜欢:

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

Web API的设计与开发

Web API的设计与开发

[日] 水野贵明 / 盛荣 / 人民邮电出版社 / 2017-6 / 52.00元

本书结合丰富的实例,详细讲解了Web API的设计、开发与运维相关的知识。第1章介绍Web API的概要;第2章详述端点的设计与请求的形式;第3章介绍响应数据的设计;第4章介绍如何充分利用HTTP协议规范;第5章介绍如何开发方便更改设计的Web API;第6章介绍如何开发牢固的Web API。 本书不仅适合在工作中需要设计、开发或修改Web API的技术人员阅读,对想了解技术细节的产品经理、运维人......一起来看看 《Web API的设计与开发》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具