Я пытаюсь использовать модуль регулярного выражения Python 2.7 для соответствия всем словам в нормированной строке Unicode NFKD. Я понимаю, что флаг re.UNICODE
добавляет поддержку Unicode к выражению \w
, но я не добился успеха.Поддержка регулярного выражения Python для акцентов в NFKD Unicode при использовании выражения ` w`
>>> s = u'ca\u0308t'
>>> print s
cät
>>> pattern = re.compile(ur'\w+', flags=re.UNICODE)
>>> pattern.findall(s)
[u'ca', u't']
Я полагаю, это потому, что \u0308
не считается алфавитно-цифровой, и поэтому не соответствует \w
. Шаблон совпадает с NFKC нормированного Unicode:
>>> s
u'ca\u0308t'
>>> import unicodedata
>>> r = unicodedata.normalize('NFKC', s)
>>> pattern.findall(r)
[u'c\xe4t']
Было бы хорошо, если с помощью re.UNICODE
бы анализатор рассматривать \u0061\u0308
эквивалентно \u00E4
. Есть ли что-то, что я делаю неправильно или не знаю?
Я просто использую NFKC, если ничто в стандартной библиотеке не поможет. Спасибо!
Для получения информации о Unicode нормализации форм: http://unicode.org/reports/tr15/
Edit: Я только что нашел, что этот вопрос был задан до: Python regex \w doesn't match combining diacritics?
Похоже, лучшим решением является использование regex
вместо re
Примечание стороны для ясности: В моем примере кода я вижу акцент появляется над '' в Т * cat', но она должна появляться над 'Ā' как в 'ä'. При редактировании сообщения акцент появляется над 'a', происходит что-то странное. – doykle
caU + 0308t соответствует стандарту '\ w' в режиме Unicode. Где U + 063U + 0308 считается одним символом. – sln
Btw, почему вы используете назначение в качестве параметра 'flags = re.UNICODE'? Это может просто вернуться 1. Попробуйте с помощью 're.UNICODE' – sln