Регулярные выражения и Unicode в Python: разница между sub и findall - PullRequest
5 голосов
/ 10 июня 2011

У меня возникают трудности при попытке выяснить ошибку в моем скрипте 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.

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

1 Ответ

7 голосов
/ 10 июня 2011

Сигнатура вызова 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)

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

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