Проверка имени Unicode - PullRequest
       33

Проверка имени Unicode

3 голосов
/ 09 марта 2009

В ASCII проверка имени не слишком сложна: просто убедитесь, что все символы в алфавитном порядке.

А как насчет Unicode (utf-8)? Как я могу убедиться, что в данной строке нет запятых или подчеркиваний (за пределами области видимости ASCII)?

(в идеале на Python)

Ответы [ 5 ]

5 голосов
/ 09 марта 2009

Просто конвертируйте bytestring (ваш utf-8) в объекты Unicode и проверьте, все ли символы алфавитны:

s.isalpha()

Этот метод зависит от локали для строк байтов.

5 голосов
/ 09 марта 2009

Может быть, модуль unicodedata полезен для этой задачи. Особенно функция category(). Для существующих категорий юникода смотрите unicode.org . Затем вы можете фильтровать знаки препинания и т. Д.

1 голос
/ 09 марта 2009

Это может быть шагом к решению:

import unicodedata
EXCEPTIONS= frozenset(u"'.")
CATEGORIES= frozenset( ('Lu', 'Ll', 'Lt', 'Pd', 'Zs') )
# O'Rourke, Franklin D. Roosevelt

def test_unicode_name(unicode_name):
    return all(
      uchar in EXCEPTIONS
        or unicodedata.category(uchar) in CATEGORIES
      for uchar in unicode_name)

>>> test_unicode_name(u"Michael O'Rourke")
True
>>> test_unicode_name(u"Χρήστος Γεωργίου")
True
>>> test_unicode_name(u"Jean-Luc Géraud")
True

Добавление исключений и дальнейшие проверки, которые я, возможно, пропустил.

1 голос
/ 09 марта 2009

В зависимости от того, как вы определяете «имя», вы можете проверить его по этому регулярному выражению:

^\w+$

Однако это позволит использовать цифры и подчеркивание. Чтобы исключить их, вы можете сделать второй тест против:

[\d_]

и сделайте проверку неудачной в матче. Эти два можно объединить следующим образом:

^(?:(?![\d_])\w)+$

Но по соображениям производительности регулярных выражений я бы лучше сделал две отдельные проверки.

С Документы :

\w

Когда флаги LOCALE и UNICODE не указано, соответствует любому буквенно-цифровой символ и нижнее подчеркивание; это эквивалентно установить [a-zA-Z0-9_]. С LOCALE это будет соответствовать набору [0-9_] плюс что угодно символы определены как буквенно-цифровые для текущей локали. Если UNICODE установить, это будет соответствовать символам [0-9_] плюс все, что классифицируется как буквенно-цифровой символ Unicode база данных свойств.

0 голосов
/ 09 марта 2009

Свойство letters модуля string должно дать вам то, что вы хотите. Это свойство зависит от локали, поэтому, если вы знаете язык текста, который вам передается, вы можете использовать setlocale() и проверять соответствие этим символам.

http://docs.python.org/library/string.html#module-string

Однако, как вы указываете, в по-настоящему "юникодном" мире нет никакого способа узнать, какие символы являются "алфавитными", если вы не знаете язык. Если вы не знаете язык, вы можете либо использовать ASCII по умолчанию, либо пробежать через локали для общих языков.

...