Эквивалент string.ascii_letters для строк Юникода в Python 2.x? - PullRequest
12 голосов
/ 24 января 2010

В модуле "string" стандартной библиотеки,

string.ascii_letters ## Same as string.ascii_lowercase + string.ascii_uppercase

есть

'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

Существует ли подобная константа, которая включала бы все, что считается буквой в юникоде?

Ответы [ 4 ]

11 голосов
/ 24 января 2010

Вы можете создать собственную константу из заглавных и строчных букв Unicode с помощью:

import unicodedata as ud
all_unicode = ''.join(unichr(i) for i in xrange(65536))
unicode_letters = ''.join(c for c in all_unicode
                          if ud.category(c)=='Lu' or ud.category(c)=='Ll')

Это делает строку длиной 2153 символа (узкая сборка Unicode Python). Для кода типа letter in unicode_letters было бы быстрее использовать набор вместо:

unicode_letters = set(unicode_letters)
7 голосов
/ 24 января 2010

Строки нет, но вы можете проверить, является ли символ буквой, используя модуль unicodedata, в частности его функцию category().

>>> unicodedata.category(u'a')
'Ll'
>>> unicodedata.category(u'A')
'Lu'
>>> unicodedata.category(u'5')
'Nd'
>>> unicodedata.category(u'ф') # Cyrillic f.
'Ll'
>>> unicodedata.category(u'٢') # Arabic-indic numeral for 2.
'Nd'

Ll означает «буква в нижнем регистре». Lu означает «буква в верхнем регистре». Nd означает «цифра, цифра».

0 голосов
/ 24 января 2010

Как упоминалось в предыдущих ответах, строка действительно будет way слишком длинной. Таким образом, вы должны ориентироваться на (а) определенный язык (и).
[РЕДАКТИРОВАТЬ: я понял, что это был случай для моего первоначального предполагаемого использования, и для большинства применений, я думаю. Однако в то же время Марк Толонен дал хороший ответ на вопрос в том виде, в котором он был задан, поэтому я выбрал его ответ, хотя использовал следующее решение]

Это легко сделать с помощью модуля "locale":

import locale
import string
code = 'fr_FR' ## Do NOT specify encoding (see below)
locale.setlocale(locale.LC_CTYPE, code)
encoding = locale.getlocale()[1]
letters = string.letters.decode(encoding)

с "буквами" в виде строки Unicode длиной 117 символов.

Очевидно, что string.letters зависит от кодировки по умолчанию для выбранного языкового кода, а не от самого языка. Если для языкового стандарта задано значение fr_FR, либо de_DE, либо es_ES, для string.letters будет изменено одно и то же значение (поскольку по умолчанию все они кодируются в ISO8859-1).

Если вы добавите кодировку к коду языка (de_DE.UTF-8), кодировка по умолчанию будет использоваться вместо string.letters. Это может привести к UnicodeDecodeError, если вы использовали оставшуюся часть кода выше.

0 голосов
/ 24 января 2010

Это было бы довольно массивной константой. Unicode в настоящее время охватывает более 100 000 различных символов. Так что ответ - нет.

Вопрос в том, зачем вам это нужно? Там может быть какой-то другой способ решения любой вашей проблемы с модулем unicodedata, например.

Обновление: с ftp: //ftp.unicode.org/ вы можете загружать файлы со всеми именами точек Юникода и другой информацией и делать с ней множество интересных вещей.

...