Убрать неразрывный пробел python

Удаление неразрывных пробелов из строк с помощью 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 **** Bar 

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

Какую версию Python вы используете (ответ может отличаться в зависимости от того, используете ли вы 2.x или 3.x)? — person Kathy Van Stone &nbsp schedule 07.04.2010

Ответы (7)

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

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

Ваше решение UTF-8 было именно тем, что мне нужно, чтобы получить неразрывный пробел в файле журнала. Хотя вывод выглядит странно, когда регистратор выводит запись журнала на консоль, которая не является UTF-8, конечно, это выглядит странно, но он становится полностью невидимым в файле журнала, в результате чего он отображается именно так, как мне нужно, с пустой строкой над метками моих столбцов. — person David A. Gray; 24.01.2018

Читайте также:  Rotate function in javascript

Требуется ли использование функции unicode() или u в Python 3? Я спрашиваю об этом, потому что я понимаю, что Python 3 кодирует каждую строку только в юникоде. — person Celdor; 05.02.2019

Этот ответ определенно является ответом 2.x — Python 3 по-разному обрабатывает строки. — person Kathy Van Stone; 11.02.2019

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

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

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

Предоставленная вами ссылка может быть хороша для новичка, но она вводит в заблуждение. Он полностью игнорирует нормализацию Unicode, например, ‘ć’ равен u’\u0107′ и может быть представлен как u’c\u0301′ unicode.org/reports/tr15 — person jfs; 08.04.2010

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

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

Также обратите внимание, что символ регулярного выражения пробелов в python соответствует неразрывным пробелам. Следующий код заменит один или несколько пробелов/неразрывных пробелов одним пробелом

import re re.sub(r'\s+', ' ', u"String with spaces and non\u00A0breaking\u00A0spaces") # 'String with spaces and non breaking spaces' 

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

Источник

Удаление неразрывных пробелов из строк с использованием 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 **** 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 , вот так:

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

Ответ 6

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

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

Источник

Python: удаление \ xa0 из строки?

В настоящее время я использую Beautiful Soup для анализа HTML-файла и вызовов get_text() , но мне кажется, что у меня осталось много \ xa0 Unicode, представляющих пробелы. Есть ли эффективный способ удалить их все в Python 2.7 и заменить их пробелами? Я думаю, что более общий вопрос будет, есть ли способ удалить форматирование Unicode?

Я попытался использовать:, line = line.replace(u’\xa0′,’ ‘) как предложено в другом потоке, но это изменило \ xa0 на u, так что теперь у меня вместо этого везде «u». ):

РЕДАКТИРОВАТЬ: Кажется, что проблема решена str.replace(u’\xa0′, ‘ ‘).encode(‘utf-8’) , но просто .encode(‘utf-8’) без, replace() кажется, заставляет его выплевывать даже более странные символы, например, \ xc2. Кто-нибудь может объяснить это?

уже пробовал, кодек ‘ascii’ не может декодировать байт 0xa0 в позиции 0: порядковый номер не в диапазоне (128)

Если строка является Unicode, вы должны использовать u’ ‘ замену, а не ‘ ‘ . Является ли исходная строка юникодом?

\ xa0 — это фактически неразрывный пробел в Latin1 (ISO 8859-1), также chr (160). Вы должны заменить его пробелом.

string = string.replace(u’\xa0′, u’ ‘)

Когда .encode (‘utf-8’), он будет кодировать юникод в utf-8, это означает, что каждый юникод может быть представлен от 1 до 4 байтов. Для этого случая \ xa0 представлен 2 байтами \ xc2 \ xa0.

Пожалуйста, обратите внимание: этот ответ с 2012 года, Python перешел, вы должны быть в состоянии использовать unicodedata.normalize сейчас

Я не знаю много о Unicode и кодировках символов . но кажется, что unicodedata.normalize будет более подходящим, чем str.replace

Ваш полезный совет для строк, но учтите, что все ссылки на эту строку также необходимо заменить. Например, если у вас есть программа, открывающая файлы, и в имени одного из файлов есть неразрывный пробел в имени, вам потребуется переименовать этот файл в дополнение к этой замене.

U + 00a0 — это неразрывный пробел в кодировке Unicode, который может быть закодирован как b’\xa0′ байт в кодировке latin1, как два байта b’\xc2\xa0′ в кодировке utf-8. Это может быть представлено как   в HTML.

Когда я пробую это, я получаю UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xa0 in position 397: ordinal not in range(128) .

В unicodedata библиотеке Python есть много полезных вещей . Одним из них является .normalize() функция.

new_str = unicodedata.normalize("NFKD", unicode_str)

Замените NFKD любым из других методов, перечисленных в ссылке выше, если вы не получите желаемых результатов.

Попробуйте использовать .strip () в конце вашей строки, line.strip() у меня получилось

Попробовав несколько методов, чтобы подвести итог, я так и сделал. Ниже приведены два способа избежать / удалить символы \ xa0 из проанализированной строки HTML.

Предположим, у нас есть наш сырой HTML следующим образом:

raw_html = '

Dear Parent,

This is a test message, kindly ignore it.

Thanks

'

Итак, давайте попробуем очистить эту строку HTML:

from bs4 import BeautifulSoup raw_html = '

Dear Parent,

This is a test message, kindly ignore it.

Thanks

'
text_string = BeautifulSoup(raw_html, "lxml").text print text_string #u'Dear Parent,\xa0This is a test message,\xa0kindly ignore it.\xa0Thanks'

Приведенный выше код создает эти символы \ xa0 в строке. Чтобы удалить их правильно, мы можем использовать два способа.

Метод № 1 (рекомендуется): первым является get_text BeautifulSoup метод с аргументом strip в виде True, поэтому наш код становится:

clean_text = BeautifulSoup(raw_html, "lxml").get_text(strip=True) print clean_text # Dear Parent,This is a test message,kindly ignore it.Thanks

Способ № 2: Другой вариант — использовать уникальные данные библиотеки Python.

import unicodedata text_string = BeautifulSoup(raw_html, "lxml").text clean_text = unicodedata.normalize("NFKD",text_string) print clean_text # u'Dear Parent,This is a test message,kindly ignore it.Thanks'

Я также подробно описал эти методы в этом блоге, к которым вы можете обратиться.

Источник

Оцените статью