Подтвердить что ты не робот

Удаление неразрывных пробелов из строк с использованием Python

У меня возникают проблемы с очень простой проблемой строки в Python (что я не могу понять). В основном, я пытаюсь сделать следующее:

'# read file into a string 
myString =  file.read()

'# Attempt to remove non breaking spaces 
myString = myString.replace("\u00A0"," ")

'# however, when I print my string to output to console, I get: 
Foo **<C2><A0>** Bar

Я подумал, что "\ u00A0" - это код выхода для unicode без разрывов, но, видимо, я этого не делаю. Любые идеи о том, что я делаю неправильно?

4b9b3361

Ответ 1

У вас нет строки в кодировке Unicode, но есть список байтов UTF-8 (что такое строки в Python 2.x).

Пытаться

myString = myString.replace("\xc2\xa0", " ")

Лучше было бы перейти на Unicode - см. Эту статью для идей. Таким образом, вы могли бы сказать,

uniString = unicode(myString, "UTF-8")
uniString = uniString.replace(u"\u00A0", " ")

и он также должен работать (предостережение: у меня сейчас нет Python 2.x), хотя вам нужно будет перевести его обратно в байты (двоичные файлы) при отправке его в файл или печати на экран.

Ответ 2

Нет, u"\u00A0" - это код u"\u00A0" для неразрывных пробелов. "\u00A0" - это 6 символов, которые не являются escape-кодом. Прочитайте это.

Ответ 3

Обратите внимание, что простой myString.strip() будет удалять не только пробелы, но и нераскрывающиеся пробелы с начала и конца myString. Не совсем то, о чем попросил ОП, но все же очень удобный во многих случаях.

Ответ 4

Нет никаких указаний в том, что вы пишете, что вы обязательно делаете что-то неправильно: если исходная строка имела неразрывное пространство между "Foo" и "Bar", вместо этого у вас вместо этого есть нормальное пространство. Это предполагает, что в какой-то момент вы расшифровали свою входную строку (которая, как я полагаю, является байтовым, если только вы не на Python 3 или file не была открыта функцией из модуля codecs) в строку Unicode, иначе вы вряд ли найдете символ Юникода в строке не-юникода байтов для целей replace. Но, тем не менее, нет четких указаний на проблемы в том, что вы пишете.

Можете ли вы уточнить, что вводит (напечатайте repr(myString) непосредственно перед заменой) и что выводит (напечатайте repr(myString) снова сразу после замены) и почему вы думаете, что проблема? Без repr строки, которые на самом деле разные, могут выглядеть одинаково, но repr помогает там.

Ответ 5

Я сомневаюсь, прежде чем добавить еще один ответ на старый вопрос, но так как Python3 считает символ Unicode "пробел без пробелов" как символ пробела, а так как строки по умолчанию являются Unicode, вы можете избавиться от пробелов без разрывов в строке s используя join и split, вот так:

s = ' '.join(s.split())

Это, конечно, также изменит любые другие пробелы (табуляции, новые строки и т.д.). И обратите внимание, что это только Python3.

Ответ 6

Вы можете просто решить эту проблему, применяя кодировку.

 cleaned_string = myString.encode('ascii', 'ignore')