Удалить непечатаемые символы python

Как удалить непечатаемые символы из строки?

Я читаю текстовый файл, используя приведенный ниже код:

import win32com.client as win32 word = win32.dynamic.Dispatch("Word.Application") word.Visible = 0 doc = word.Documents.Open(SigLexiconFilePath) 

Я получаю строки из файла, в котором много непечатаемых символов:

str = "\xa0keine\xa0freigäbü\xa0\x0b\r\x07" 

Я пробовал следующие коды для удаления непечатаемых символов:

import string str = "\xa0keine\xa0freigäbü\xa0\x0b\r\x07" filtered_string = "".join(filter(lambda x:x in string.printable, str)) 

Это дает мне следующий результат:

Другой фрагмент кода, который я пробовал:

str = str.split('\r')[0] str = str.strip() 

Это дает мне следующий результат:

Как я могу удалить все эти непечатаемые символы, чтобы получить результат ниже желаемого, используя минимальный код:

3 ответа

Элегантным питоническим решением для удаления «непечатаемых» символов из строки в Python является использование строкового метода isprintable() вместе с выражением генератора или пониманием списка в зависимости от варианта использования, т.е. размер строки:

''.join(c for c in str if c.isprintable()) 

str.isprintable() Возвращает True, если все символы в строке могут быть напечатаны или строка пуста, в противном случае — False. Непечатаемые символы — это символы, определенные в базе данных символов Unicode как «Другие» или «Разделители», за исключением пробела ASCII (0x20), который считается пригодным для печати. (Обратите внимание, что печатные символы в этом контексте — это те символы, которые не следует экранировать при вызове repr() для строки. Это не имеет отношения к обработке строк, записанных в sys.stdout или sys.stderr.)

Все эти символы кажутся символами пробела. Вы можете попробовать модуль unicodedata Python, чтобы последовательно преобразовать некоторые из них в правильные символы пробела:

>>> unicodedata.normalize("NFKD","\xa0keine\xa0freigäbü\xa0\x0b\r\x07") ' keine freigäbü \x0b\r\x07' 

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

>>> ' keine freigäbü \x0b\r\x07'.replace("\x0b"," ").replace("\r"," ").\ replace("\x07"," ").strip() 'keine freigäbü' 

Попробуйте с этой строкой.

import re def convert_tiny_str(x:str): """ Taking in consideration this: > https://www.ascii-code.com/ Citting: "The first 32 characters in the ASCII-table are unprintable control codes and are used to control peripherals such as printers." From Hex code 00 to Hec code 2F, [00, 2F]. Now, from ASCII Extended, the printable characters are listed from \x20 to \xFF in Hexadecimal code, [20, FF]. For that the Regular Expression that I can show like a possible solution it is this: 1- Replace "all the characers, except the printable characters", by a ''. 2- Then, the character \xa0 it is still componing the str result. Replace it by an ' '. """ _out = re.sub(r'[^\x20-\xff]',r'', _str) # >> '\xa0keine\xa0freigäbü\xa0' return re.sub(r'\xa0',r' ', _out) _str = "\xa0keine\xa0freigäbü\xa0\x0b\r\x07" x = convert_tiny_str(_str) print(x) # >>' keine freigäbü ' 

Источник

Читайте также:  Example of HTML article tag

Как удалить специальные символы из строки в Python

Из-за использования некоторых специальных символов в коде часто возникают ошибки. Эти специальные символы могут встречаться в строках, а также использоваться с операторами. В этой статье мы расскажем, как удалить специальные символы из строки в Python.

Итак, начнем с открытия оболочки и приступим!

Как удалить специальные символы из строки при помощи join() и isalnum()

Для создания кода вам понадобится файл Python. Имя файла должно иметь расширение .py. После создания файла откройте его в каком-нибудь редакторе. Вы можете использовать любой встроенный редактор, например Vim, Nano или даже текстовый редактор. И, конечно, можно использовать вашу любимую IDE, например, Pycharm или VS Code. Мы воспользуемся консольным редактором nano:

$ touch remove.py $ nano remove.py

Файл успешно открыт в редакторе. В самом верху добавляем строку #!/usr/bin/python3 . Это путь к оболочке, которая должна использоваться для выполнения этого скрипта.

Дальше давайте инициализируем переменную v1 строкового типа, содержащую некоторые специальные и обычные символы. При помощи функции print() мы выводим значение этой переменной в консоль.

После этого мы используем метод isalnum() , чтобы получить только цифро-буквенные символы из этой строки и игнорировать все специальные символы. Все обычные символы будут объединены и сохранены в переменной v2 с помощью метода join() . После чего мы выведем новое получившееся значение с помощью функции print() :

#!/usr/bin/python3 v1 = “HELLO! This, is@an’Example String:” print (“Original string: ”, v1) v2 = ‘’.join(char for char in v1 if char.isalnum()) print (“Updated string: ”, v2)

После запуска нашего скрипта remove.py мы получили исходную строку со специальными символами и обновленную строку без специальных символов, как это можно увидеть ниже:

Как мы видим, во второй строке все лишние специальные символы удалены. Мы достигли желаемого результата. Теперь давайте посмотрим, как сделать это другим способом.

Удаление специальных символов при помощи join() и filter()

Давайте воспользуемся методом соединения join() . Откройте тот же файл и инициализируйте строку с обычными и специальными символами. Первоначальная строка будет выводиться на экран первой.

Далее мы используем метод join() с функцией filter() для строковой переменной v1 , чтобы отфильтровать символы. В данном случае для сбора только обычных символов из переменной v1 используется метод isalnum() . Затем мы выводим на экран обновленную строку:

#!/usr/bin/python3 v1 = “HELLO! This , is@an’Example String:” print (“Original string: ”, v1) v2 = ‘’.join(filter(str.isalnum, v1)) print (“Updated string: ”, v2)

Результат получается такой же, как в предыдущем примере, хотя здесь мы обошлись без цикла и условий:

Давайте еще раз обновим код. Мы взяли длинную строку со всеми специальными символами, какие только есть на нашей клавиатуре. Снова воспользуемся теми же функциями join() , filter() и isalnum() . Функцию print() используем для вывода исходной и обновленной строки.

Читайте также:  Request get path java

Наш обновленный код будет выглядеть следующим образом:

#!/usr/bin/python3 v1 = “a!b#c$d%e^f&g*h (i)j_k~l`m/n?o.p>q’ r]s[tv=w+x-y\z” print (“Original string: ”, v1) v2 = ‘’.join(filter(str.isalnum, v1)) print (“Updated string: ”, v2)

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

Удаление специальных символов из строки с применением метода sub из пакета re

Давайте воспользуемся функцией sub из пакета re , чтобы удалить специальные символы.

Метод sub() используется для гибкой замены одних символов другими. Синтаксис:

import re result = re.sub(pattern, repl, string, count=0, flags=0) # pattern - строка шаблона регулярного выражения, # repl - строка замены, # string - строка для поиска, # count=0 - число, максимальное число вхождений pattern, # flags=0 - один или несколько флагов.
#!/usr/bin/python3 import re v1 = “HELLO! This , is@an’Example%String:”; print (“Original string: ”, v1); v2 = re.sub(r”[^a-Za-Z0-9]” , “”, v1) print (“Updated string: ”, v2);

Сперва импортируем в код сам модуль re . Далее инициализируем строку и выводим ее на экран при помощи print() .

Затем создадим переменную v2 , в которую сохраним обновленную строку.

Для обновления строки, т.е. удаления специальных символов из исходной, воспользуемся методом sub() .

Внутри метода мы сперва ставим флаг r , благодаря которому не придется экранировать обратную косую черту. (Больше на тему сырых строк и экранирования можно почитать в туториале «Строковые и байтовые литералы», — прим. ред. Pythonist.ru).

Затем в кавычках указываем шаблон. Заданный шаблон [^a-Za-Z0-9] соответствует всем символам, НЕ указанным в наборе (символ ^ в начале набора служит для инвертирования).

После этого указываем, на что нужно заменить указанные символы — на пустую строку. В самом конце указываем строку, в которой нужно искать, — пишем имя переменной.

Таким образом все специальные символы из строки v1 будут заменены пустыми строками, т.е. фактически удалены. Чтобы увидеть результат, пишем еще один print() .

Запустим наш код и получим исходную строку и обновленную:

Как видите, есть несколько способов удалить специальные символы из строки. И регулярные выражения – один из них. Подробнее про модуль re и регулярные выражения можно почитать в статье «Регулярные выражения в Python».

Заключение

Итак, мы разобрались, как удалить специальные символы из строки в Python. Мы проделали это разными способами: при помощи регулярных выражений, методов join() , filter() и isalnum() . Вы можете использовать тот способ, который вам больше по душе.

Надеемся, данное руководство было вам полезно. Желаем успехов в написании кода!

Источник

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

В Python нет классов регулярных выражений POSIX, и я не могу написать [:print:], имея в виду то, что я хочу. Я не знаю, как в Python определить, является ли символ печатным или нет.

РЕДАКТИРОВАТЬ: он должен поддерживать символы Unicode, а также. Способ string.printable с легкостью удалит их из вывода. curses.ascii.isprint вернет false для любого символа Юникода.

Читайте также:  Как сменить шрифты css

16 ответов

Итерирование по строкам, к сожалению, довольно медленно в Python. Регулярные выражения на порядок быстрее для такого рода вещей. Вам просто нужно создать класс персонажа самостоятельно. Модуль unicodedata очень полезен для этого, особенно функция unicodedata.category(). См. Unicode Character Database для описания категорий.

import unicodedata, re all_chars = (unichr(i) for i in xrange(0x110000)) control_chars = ''.join(c for c in all_chars if unicodedata.category(c) == 'Cc') # or equivalently and much more efficiently control_chars = ''.join(map(unichr, range(0,32) + range(127,160))) control_char_re = re.compile('[%s]' % re.escape(control_chars)) def remove_control_chars(s): return control_char_re.sub('', s) 

Насколько я знаю, наиболее питонным / эффективным методом будет:

import string filtered_string = filter(lambda x: x in string.printable, myStr) 

Вы можете попробовать настроить фильтр, используя unicodedata.category() функция:

printable = Set('Lu', 'Ll', . ) def filter_non_printable(str): return ''.join(c for c in str if unicodedata.category(c) in printable) 

Следующее будет работать с вводом Unicode и довольно быстро.

import sys # build a table mapping all non-printable characters to None NOPRINT_TRANS_TABLE = < i: None for i in range(0, sys.maxunicode + 1) if not chr(i).isprintable() >def make_printable(s): """Replace non-printable characters in a string.""" # the translate method on str removes characters # that map to None from the string return s.translate(NOPRINT_TRANS_TABLE) assert make_printable('Café') == 'Café' assert make_printable('\x00\x11Hello') == 'Hello' assert make_printable('') == '' 

Мои собственные тесты показывают, что этот подход быстрее, чем функции, которые перебирают строку и возвращают результат, используя str.join ,

def filter_nonprintable(text): import string # Get the difference of all ASCII characters from the set of printable characters nonprintable = set([chr(i) for i in range(128)]).difference(string.printable) # Use translate to remove all non-printable characters return text.translate() 

См. Этот пост Stackru об удалении знаков препинания, чтобы узнать, как.translate() сравнивается с regex & .replace()

Эта функция использует списки и str.join, поэтому она работает за линейное время вместо O(n^2):

from curses.ascii import isprint def printable(input): return ''.join(char for char in input if isprint(char)) 

Еще один вариант в Python 3:

Основываясь на ответе @Ber, я предлагаю удалить только управляющие символы, как определено в категориях базы данных символов Unicode:

import unicodedata def filter_non_printable(s): return ''.join(c for c in s if not unicodedata.category(c).startswith('C')) 

Элегантным питоническим решением для удаления «непечатаемых» символов из строки в Python является использование строкового метода isprintable() вместе с выражением генератора или пониманием списка в зависимости от варианта использования, т.е. размер строки:

 ''.join(c for c in my_string if c.isprintable()) 

str.isprintable() Возвращает True, если все символы в строке могут быть напечатаны или строка пуста, в противном случае — False. Непечатаемые символы — это символы, определенные в базе данных символов Unicode как «Другие» или «Разделители», за исключением пробела ASCII (0x20), который считается пригодным для печати. (Обратите внимание, что печатные символы в этом контексте — это те символы, которые не следует экранировать при вызове repr() для строки. Это не имеет отношения к обработке строк, записанных в sys.stdout или sys.stderr.)

Источник

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