2016-05-24 3 views
3

У меня есть текст на польском языке, в котором я хочу, чтобы отфильтровать непольское письмо, но проблема заключается в том, что польские специфических буквы исчезаютPython - неправильное кодирование, регулярное выражение

# coding: utf-8 
import re 

_NOT_LETTERS = re.compile('[^a-ząćęłóńśżź]+') 

text = u'dzień dobry i wszystkiego najlepszego życzę' 

data = _NOT_LETTERS.sub(' ', text) 

print data 

и результат

dzie dobry i wszystkiego najlepszego ycz 

вместо ожидаемого

dzień dobry i wszystkiego najlepszego życzę 

Как я могу это исправить? Я получаю переменный текст из библиотеки третьей стороны

+0

Шаблон должен использовать строку Юникода слишком: 're.compile (и«[^ а-ząćęłóńśżź] +») 'в противном случае многобайтовые символы рассматриваются как отделенные байты * (то есть: один байт, один знак) *. –

+0

Отлично, он работает. Если вы хотите добавить ответ, и я его приму – Mateo2

ответ

1

акцентированных букв не в диапазоне ASCII и требуются несколько байт в кодировке UTF-8, например, характер:

U+0144 ń  LATIN SMALL LETTER N WITH ACUTE 

кодируются на два байте : c5 84

Когда вы пишете строку без указания, что это строка с многобайтными символами, каждый один байт рассматриваются как символ (символ \xc5 и характер \x84, но не характер ń (U + 0144), что ISN 't признано.)

В Python 2.7 вам нужно указать, что ваша строка является строкой unicode, иначе все многобайтовые символы рассматриваются как одиночные байты. Вы можете проверить это самостоятельно писать:

>>> text = u'dzień' 
>>> [c for c in text] 
[u'd', u'z', u'i', u'e', u'\u0144'] 

>>> text = 'dzień' 
>>> [c for c in text] 
['d', 'z', 'i', 'e', '\xc5', '\x84'] 

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

re.compile(u'[^a-ząćęłóńśżź]+') 
Смежные вопросы