регулярное выражение и Unicode UTF-8 в Python? - PullRequest
4 голосов
/ 26 марта 2011

У меня есть блок кода :( Код Django)

        list_temp = []
        tagname_re = re.compile(r'^[\w+\.-]+$', re.UNICODE)
        for key,tag in list.items():
            if len(tag) > settings.FORM_MAX_LENGTH_OF_TAG or len(tag) < settings.FORM_MIN_LENGTH_OF_TAG:
                raise forms.ValidationError(_('please use between %(min)s and %(max)s characters in you tags') % { 'min': settings.FORM_MIN_LENGTH_OF_TAG, 'max': settings.FORM_MAX_LENGTH_OF_TAG})
            if not tagname_re.match(tag):
                raise forms.ValidationError(_('please use following characters in tags: letters , numbers, and characters \'.-_\''))
            # only keep one same tag
            if tag not in list_temp and len(tag.strip()) > 0:
                list_temp.append(tag)

Это позволяет мне поместить имя тега в символ Unicode.

Но я не знаю почему с моим Unicode(khmer uncode Khmer Symbols Диапазон: 19E0–19FF Стандарт Unicode, версия 4.0). Я не смог.

Мой вопрос:

Как мне изменить вышеуказанный код tagname_re = re.compile(r'^[\w+\.-]+$', re.UNICODE), чтобы адаптировать мойСимвол Unicode.? Потому что, если я введу тег с "នយោបាយ", я получу сообщение?

please use following characters in tags: letters , numbers, and characters \'.-_\''

Ответы [ 3 ]

5 голосов
/ 26 марта 2011

ោ (U + 17C4 KHMER VOWEL SIGN OO) и ា (U + 17B6 KHMER VOWEL SIGN AA) не являются буквами, они объединяют знаки, поэтому они не соответствуют \ w.

4 голосов
/ 02 апреля 2011

Посмотрите на новую реализацию регулярных выражений в PyPI:

http://pypi.python.org/pypi/regex

В Python 3 написано:

>>> import regex
>>> regex.match("\w", "\u17C4")
<_regex.Match object at 0x00F03988>
>>> regex.match("\w", "\u17B6")
<_regex.Match object at 0x00F03D08>
3 голосов
/ 26 марта 2011

ответ Бобинса , безусловно, правильный.Однако, прежде чем вы решите эту проблему, может быть еще одна - tag определенно unicode, а не str?Например:

>>> str_version = 'នយោបាយ'
>>> type(str_version)
<type 'str'>
>>> print str_version
នយោបាយ
>>> unicode_version = 'នយោបាយ'.decode('utf-8')
>>> type(unicode_version)
<type 'unicode'>
>>> print unicode_version
នយោបាយ
>>> r = re.compile(r'^(\w+)',re.U)
>>> r.search(str_version).group(1)
'\xe1'
>>> print r.search(str_version).group(1)

>>> r.search(unicode_version).group(1)
u'\1793\u1799'
>>> print r.search(unicode_version).group(1)
នយ

В качестве еще одного небольшого замечания в вашем регулярном выражении + в классе символов означает, что в последовательности букв и знаков препинания также допускается литерал +.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...