Подтвердить что ты не робот

Эквивалент string.ascii_letters для строк unicode в python 2.x?

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

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

является

'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

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

4b9b3361

Ответ 1

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

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)

Ответ 2

Нет строки, но вы можете проверить, является ли символ буквой, используя модуль 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 означает цифру, цифру.

Ответ 3

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

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

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

Ответ 4

Как упоминалось в предыдущих ответах, строка действительно была бы слишком длинной. Таким образом, вам нужно настроить таргетинг (а) определенного языка (ов).
[EDIT: Я понял, что это имеет место для моего первоначального предназначения, и для большинства применений, я думаю. Тем не менее, в то же время Марк Толонен дал хороший ответ на вопрос, поскольку его попросили, поэтому я выбрал его ответ, хотя я использовал следующее решение]

Это легко сделать с помощью модуля "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, если вы использовали остальную часть вышеуказанного кода.