Удаление неразрывных пробелов из строк с использованием 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 без разрывов, но, видимо, я этого не делаю. Любые идеи о том, что я делаю неправильно?
Ответы
Ответ 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')