2016-02-04 5 views
1

Я пытаюсь использовать модуль регулярного выражения 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

+0

Примечание стороны для ясности: В моем примере кода я вижу акцент появляется над '' в Т * cat', но она должна появляться над 'Ā' как в 'ä'. При редактировании сообщения акцент появляется над 'a', происходит что-то странное. – doykle

+0

caU + 0308t соответствует стандарту '\ w' в режиме Unicode. Где U + 063U + 0308 считается одним символом. – sln

+0

Btw, почему вы используете назначение в качестве параметра 'flags = re.UNICODE'? Это может просто вернуться 1. Попробуйте с помощью 're.UNICODE' – sln

ответ

0

Вы можете использовать это: \S+

\S - Все, кроме пробелов

Exemple:

>>> re.compile(ur'\S+', flags=re.UNICODE).findall(u'ca\u0308t') 
[u'ca\u0308t'] 
+0

Благодарим вас за ответ. К сожалению, я работаю с естественным языком и не могу предположить, что свободное пространство является идеальным обратным алфавитно-цифровым текстом. Например, из '' cät! 'Я хотел бы захватить только' cät'. На самом деле, я пытаюсь заставить чужой код работать с нормализованным Unicode. Выражение, вызывающее проблемы, - это 're.compile (r '[\ w \ - \' _/&] + ', re.UNICODE)'. Итак, есть пунктуация, которую я хотел бы захватить, но большая ее часть должна быть выброшена. – doykle