Проблема заключается в том, что вы смешиваете 8-битные строки и полные строки Unicode. @cdosborn дал отличное описание, как это привело к частичному замене символов.
В Python> 2.x существует два способа удержания текста: строки и строки Unicode. Строки могут содержать текст , закодированный в простых ASCII, ANSI, Windows-1252, UTF-8, UTF-16. Проблема в том, что вам должны знать, в какой кодировке находится текст, если вам нужно его преобразовать. Строки Unicode на руке абсолютно однозначны, так как они являются результатом явного преобразования из строки с использованием известной кодировки с использованием escape-кодов Unicode (u "\ u00A3") или таких функций, как unichr().
Лучшая практика - всегда декодировать строки в Юникоде при вводе кода. Затем закодируйте на выходе. Это поведение по умолчанию для Python 3.x и других языков, таких как Java.
Если вы работаете с файлами, то codecs
модуль обеспечивает хороший способ для преобразования текста в строки Unicode на пути в:
my_file = codecs.open("filename.txt", "r", "utf-8")
my_unicode_string = my_file.read()
Очевидно, что если ваш файл находится в другой кодировке, изменить utf-8
для имени кодирования - См имена кодеков: https://docs.python.org/2/library/codecs.html#standard-encodings
Если вы имеете дело со строками из других (STDIN, WebForms), конвертировать с помощью:
my_unicode_string = "my €uro sign in utf-8".decode("utf-8")
Опять же, изменить utf-8
аргумент соответственно
После того, как у вас есть строка Unicode, вы можете использовать его, как вы хотите. Для того, чтобы сделать простой поиск и замену для знака фунта сделать:
my_unicode_string.replace(unichr(163), "")
Чтобы сделать код более удобным для чтения, вы можете кодировать исходный код в UTF-8 и объявить кодировку. Это означает, что вам не нужно скрывать символы Unicode в escape-последовательностях или ординалах.
Сведя в целом:
# -*- coding: utf-8 -*-
my_file = codecs.open("filename.txt", "r", "utf-8")
my_unicode_string = my_file.read()
replaced_unicode_string = my_unicode_string.replace("£", "")
Теперь, если вы хотите написать свой replaced_unicode_string
в другой файл:
my_output_file = codecs.open("another_filename.txt", "w", "utf-8")
my_output_file.write(replaced_unicode_string)
Вы должны быть очень конкретными в кодировании при работе со специальными символами. Убедитесь, что вы знаете кодировку файла, который вы открываете, тот, который вы пишете, и свой собственный код. Если вы используете Python 2.x, пожалуйста, отметьте свой вопрос соответствующим образом, так как обработка кодировки отличается в двух версиях. – Cilyan
используйте 'codecs.open' вместо open, а затем просто' string.replace (u '£', '') ', здесь нет необходимости в regex. – wim
@alessadro: кодировка исходного кода Python имеет * ничего *, чтобы сделать это. – jfs