Перейти к содержимому

Как очистить строку от ненужных символов python

  • автор:

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

Есть строка вида ‘ .,Qwertt/werwer/wer qwer qer/qwert /’
Нужно удалить пробелы, запятые, слеши и тп из начала и конца строки при помощи модуля re.
Количество и набор «мусорных» символов в начале и конце произвольное.
Остальные символы среди текста должны остаться без изменений.
Начальный и конечный символы строки должны быть буквой или цифрой.

  • Вопрос задан более трёх лет назад
  • 858 просмотров

5 простых способов удалить символ из строки

Существует несколько методов, позволяющих удалить определенный символ из строки:

  • Примитивный метод.
  • Функция replace().
  • Срезы и конкатенация.
  • Метод join() и генератор списков.
  • Метод translate()

Важная деталь — строки в Python неизменяемы. Исходная строка останется нетронутой, а новую вернут методы, о которых написано выше.

Задачи по строкам и решения к ним у нас в телеграм канале PythonTurbo

1. Примитивный метод удаления символа из строки

Суть этого метода проста. Мы пишем цикл и создаем новую пустую строку. Цикл работает так: все символы кроме элемента с индексом n помещаются в новую строку. ( n — индекс элемента, который нам нужно удалить)

input_str = "pythonist" # Выводим в консоль исходную строку print ("Исходная строка: " + input_str) result_str = "" for i in range(0, len(input_str)): if i != 3: result_str = result_str + input_str[i] # Выводим в консоль строку после удаления i-го элемента print ("Строка после удаления i-го элемента: " + result_str)
Исходная строка: pythonist Строка после удаления i-го элемента: pytonist

2. Удаление элемента из строки с помощью метода replace()

str = "pythonist" print ("Исходная строка: " + str) res_str = str.replace('t', '') # Удаление всех 't' print("Строка после удаления всех символов t: " + res_str) # Удаление только первой t res_str = str.replace('t', '', 1) print ("Строка после удаления первого t: " + res_str)
Исходная строка: pythonist Строка после удаления всех символов t: pyhonis Строка после удаления первого t: pyhonist

Мини-задачка для вашей тренировки метода replace()

«Напишите программу на Python для получения строки из заданной строки, в которой все вхождения первого символа заменены на ‘$’, кроме самого первого символа.»

Пример: print(change_char(‘restart’))
»»» resta$t

Решение задачки можно глянуть у нас в канале

3. Удаление символа с помощью срезов и конкатенации

str = "pythonist" print ("Исходная строка: " + str) # Удаляем элемент с индексом 3 # с помощью срезов и объединения res_str = str[:3] + str[4:] print ("Строка после удаления символа: " + res_str
Исходная строка: pythonist Строка после удаления символа: pytonist

4. Удаление символа с помощью метода join() и генераторов списков

Суть этого метода в том, чтобы конвертировать строку в эквивалентный список. После этого все элементы кроме того, который мы собираемся удалить, объединяются в строку.

str = "pythonist" print("Исходная строка: " + str) # Удаление элемента с индексом 2 # с помощью join() и генератора списков res_str = ''.join([str[i] for i in range(len(str)) if i != 2]) print("Строка после удаления символа: " + res_str)
Исходная строка: pythonist Строка после удаления символа: pyhonist

5. Удаление символа из строки с помощью метода translate()

str = 'pythonist123pythonist' print(str.translate())

Как удалить специальные символы из строки в 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 мы получили исходную строку со специальными символами и обновленную строку без специальных символов, как это можно увидеть ниже:

$ python3 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)

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

$ python3 remove.py

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

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

#!/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)
$ python3 remove.py

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

Удаление специальных символов из строки с применением метода 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() .

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

$ python3 remove.py

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

Заключение

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

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

Необходимо очистить строку от посторонних символов

Строка содержит различные символы, нужно удалить все, оставив лишь буквы и пробелы. Как я понимаю, нужно действовать через регулярные выражения, но как конкретно — мне непонятно.

Отслеживать
1,342 3 3 золотых знака 14 14 серебряных знаков 27 27 бронзовых знаков
задан 31 авг 2015 в 9:23
157 1 1 золотой знак 1 1 серебряный знак 12 12 бронзовых знаков
похожие вопросы: Удалить все цифры из строки, Как удалить все пробелы из строки в Python?
2 сен 2015 в 23:27

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

При помощи regexp можно так:

import re s = 'Hello!@#!%!#&&!*!#$#%@*+_< world!' reg = re.compile('[^a-zA-Z ]') print(reg.sub('', s)) 

Отслеживать
ответ дан 31 авг 2015 в 9:37
3,587 1 1 золотой знак 11 11 серебряных знаков 19 19 бронзовых знаков
Все получилось, но команду вводил reg, а не regex, видимоб различие версий сказывается. Спасибо!
31 авг 2015 в 13:25
Прошу прощения, это у меня опечатка.
1 сен 2015 в 0:49

Имеется метод str.translate(), который удаляет все символы из строки, содержащиеся в некотором наборе. regexp тут не нужны скорее всего.

Отслеживать
ответ дан 31 авг 2015 в 9:28
Владимир Мартьянов Владимир Мартьянов
9,669 4 4 золотых знака 21 21 серебряный знак 36 36 бронзовых знаков

наткнулся на такую строчку str.translate(None, string.punctuation), но при ее реализации выдает, что метод translate принимает только один аргумент

31 авг 2015 в 9:57

А у меня все работает. Без конкретного кода и версии Питона (хотя вряд ли в ней дело) ничем не помочь.

31 авг 2015 в 10:00

python 3.4 import string fhand= open('C:\Python34\west.txt') intab=string.punctuation outtab=None trantab=maketrans(intab, outtab) for line in fhand: line = line.translate(trantab) line = line.lower() print(line) #затем идет работа со строкой(подсчет букв)

31 авг 2015 в 10:14
да. с оформлением коммента косяк 🙁
31 авг 2015 в 10:14
Начните с минимального кода, без файлов, punctuation и т.п.
31 авг 2015 в 10:17

Если хочется оставить только ascii буквы и соответствующие стандартные символы пробела, то bytes.translate() является наиболее эффективным методом:

#!/usr/bin/env python3 from string import ascii_letters, whitespace good_chars = (ascii_letters + whitespace).encode() junk_chars = bytearray(set(range(0x100)) - set(good_chars)) def clean(text): return text.encode('ascii', 'ignore').translate(None, junk_chars).decode() print(clean('Hello1@#!%!#&&!*!#$#%@*+_ < world!')) # ->Hello world 

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

>>> import regex as re # $ pip install regex >>> print(re.sub(r'[^\w\s]', '', 'Hello1@#!%!#&&!*!#$#%@*+_<\u00A0ёж!')) Hello1_ ёж >>> print(re.sub(r'[^\pL\p]', '', 'Hello1@#!%!#&&!*!#$#%@*+_<\u00A0ёж!')) Hello еж 

Стандартный re модуль не поддерживает \p<> Юникодные свойства, поэтому необходимо использовать regex модуль. Различные классы символов такие как \w , \pL могут порождать слегка отличные результаты (см. ёж vs. еж в примере). Можно также использовать Юникодные свойства напрямую: unicodedata + unicode.translate() .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *