Unicode空白是否有Python常量?
這個問題被確定為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