Регулярные выражения и Unicode в Python: разница между sub и findall

У меня возникают трудности с поиском ошибки в моем скрипте Python (2.7). Я получаю разницу с использованием sub и findall в распознавании специальных символов.

Вот код:

>>> re.sub(ur"[^-' ().,\w]+", '' , u'Castañeda', re.UNICODE) u'Castaeda' >>> re.findall(ur"[^-' ().,\w]+", u'Castañeda', re.UNICODE) [] 

Когда я использую findall, он правильно видит – как алфавитный символ, но когда я использую sub, он заменяет это – рассматривая его как неалфавитный символ.

Я смог получить правильную функциональность, используя findall с string.replace, но это кажется плохим решением. Кроме того, я хочу использовать re.split, и у меня возникают те же проблемы, что и при re.sub.

Заранее спасибо за помощь.

  • Как сообщить Python, что sys.argv находится в Unicode?
  • кодек 'ascii' не может кодировать символ в позиции * ord не в диапазоне (128)
  • Уроки Python и unicode
  • UnicodeEncodeError: кодек ascii не может кодировать символ u '\ xe9' в позиции 7: порядковый номер не в диапазоне (128)
  • Неподдерживаемые символы ввода
  • Преобразование текста, содержащего COMBINING DIAERESIS, в utf-8
  • специфичная для платформы семантика Unicode в Python 2.7
  • Преобразование строки Unicode в китайский символ
  • One Solution collect form web for “Регулярные выражения и Unicode в Python: разница между sub и findall”

    Подпись вызова re.sub :

     re.sub(pattern, repl, string, count=0) 

    Так

     re.sub(ur"[^-' ().,\w]+", '' , u'Castañeda', re.UNICODE) 

    устанавливает count для re.UNICODE , который имеет значение 32.

    Попробуйте вместо этого:

     In [57]: re.sub(ur"(?u)[^-' ().,\w]+", '', u'Castañeda') Out[57]: u'Casta\xf1eda' 

    Размещение (?u) в начале регулярного выражения является альтернативным способом указания флага re.UNICODE в самом регулярном выражении. Вы также можете установить другие флаги (?iLmsux) таким образом. (Для получения дополнительной информации нажмите эту ссылку и найдите «(? ILmsux)».)

    Аналогично, сигнатура вызова re.split :

     re.split(pattern, string, maxsplit=0) 

    Решение такое же.

    Python - лучший язык программирования в мире.