Удаление неразрывных пробелов из строк с помощью Python - PullRequest
22 голосов
/ 07 апреля 2010

У меня проблемы с очень простой строкой в ​​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 неразрывных пробелов, но, видимо, я делаю это неправильно Есть идеи, что я делаю не так?

Ответы [ 6 ]

38 голосов
/ 07 апреля 2010

У вас нет строки в кодировке 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), хотя вам нужно будет перевести его обратно в байты (двоичные файлы) при отправке его в файл или печати на экран .

6 голосов
/ 07 апреля 2010

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

2 голосов
/ 10 сентября 2018

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

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

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

1 голос
/ 20 августа 2017

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

0 голосов
/ 17 декабря 2018

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

 cleaned_string = myString.encode('ascii', 'ignore')
0 голосов
/ 07 апреля 2010

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

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

...