Эквивалент string.ascii_letters для строк unicode в python 2.x?
В модуле "строка" стандартной библиотеки
string.ascii_letters ## Same as string.ascii_lowercase + string.ascii_uppercase
является
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
Есть ли подобная константа, которая включает все, что считается буквой в юникоде?
Ответы
Ответ 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, если вы использовали остальную часть вышеуказанного кода.