Строки — один из базовых типов данных в языке программирования Python, который хранит последовательность символов.
Со строками можно выполнять множество операций: разделять, соединять, заменять, сравнивать и т.д.
Однако иногда строки необходимо форматировать, очищая от лишних символов. Например, удалять проблемы, которые не нужны.
В этой статье мы рассмотрим существующие способы удаления пробелов из строки в языке программирования Python с интерпретатором версии 3.10.12.
Часто необходимо удалить не все пробелы целиком, а только лишние. Например, в начале и конце строки.
Для этого в языке Python есть несколько похожих методов:
strip()
удаляет пробелы и в начале строки, и в концеlstrip()
удаляет пробелы только в начале строкиrstrip()
удаляет пробелы только в конце строкиВот пример того, как можно очистить строку от лишних пробелов по краям:
text_before = " Это некоторая строка с пробелами "
text_after = text_before.strip()
text_after_left = text_before.lstrip()
text_after_right = text_before.rstrip()
print(text_after)
print(text_after_left)
print(text_after_right)
В терминале консоли появится вот такой результат:
Это некоторая строка с пробелами
Это некоторая строка с пробелами
Это некоторая строка с пробелами
cloud
В некоторых случаях необходимо удалить все пробелы полностью. Это делается через замену каждого вхождения символа пробела на «отсутствующий символ»:
text_before = " Это некоторая строка с пробелами "
text_after = text_before.replace(' ', '')
print(text_after)
В консоли появится строка, в которой не будет ни одного пробела:
Этонекотораястрокаспробелами
Есть и другой способ удаления всех пробелов — менее интуитивный, но в некоторых случаях более гибкий:
text_before = " Это некоторая строка с пробелами "
text_after = text_before.translate({ord(' '): None})
print(text_after)
Консольный вывод будет аналогичным предыдущему:
Этонекотораястрокаспробелами
Функция translate()
принимает в качестве аргумента словарь, ключи которого — ASCII-коды заменяемых символов, а значения — символы, на которые выполняется замена.
При этом функция ord()
преобразует явно указанный символ в соответствующий ему код ASCII.
Таким образом, метод translate()
дает больше гибкости — можно за один раз заменить множество символов.
Если в коде необходимо выполнить несколько строковый преобразований, то можно заранее подготовить специальную таблицу символов, которая будет передаваться в качестве аргумента функции translate()
:
text_before1 = " Это некоторая строка с пробелами "
text_before2 = " 1 2 3 4 5 "
text_before3 = " { 'someData': 100, 'otherData': 'information' } "
space_table = str.maketrans({' ': None})
text_after1 = text_before1.translate(space_table)
text_after2 = text_before2.translate(space_table)
text_after3 = text_before3.translate(space_table)
print(text_after1)
print(text_after2)
print(text_after3)
В консольном терминале появится вот такой вывод:
Этонекотораястрокаспробелами
12345
{'someData':100,'otherData':'information'}
Самый простой способ удалить все повторяющиеся пробелы в строке — последовательно выполнить несколько операций:
Разделить строку с помощью функции split()
по разделителю в виде символов пробела, получив список подстрок.
Объединить подстроки из списка с помощью функции join()
в целую строку с помощью разделителя в виде одного символа пробела.
Вот как это можно сделать:
text_before = " Это некоторая строка с пробелами "
text_splitted = text_before.split() # делим строку на подстроки, при этом разделитель не указываем — пробел является разделителем по умолчанию
text_after = ' '.join(text_splitted) # соединяем полученные подстроки в одну строку, вызывая функцию от символа пробела, который и является разделителем
print(text_after)
В консоли появится отформатированная строка без лишних пробелов:
Это некоторая строка с пробелами
Показанные манипуляции со строкой можно записать короче:
text_before = " Это некоторая строка с пробелами "
text_after = ' '.join(text_before.split())
print(text_after)
Консольный вывод будет тот же самый:
Это некоторая строка с пробелами
На самом деле таким способом можно подставить любой символ вместо пробела:
text_before = " Это некоторая строка с пробелами "
text_after = '_'.join(text_before.split())
print(text_after)
В этом случае в терминале консоли появится уже такой вывод:
Это_некоторая_строка_с_пробелами
Показанные способы эффективны в крайне простых сценариях, но зачастую строки имеют более неоднородную символьную структуру, от чего требуются более сложные методы удаления пробелов.
Наиболее гибкий способ редактирования строк — регулярные выражения.
import re # импортируем модуль для работы с регулярными выражениями
text_before = " Это некоторая строка с пробелами . " # строка, в которой есть последовательности двух и более пробелов, а также несколько одиночных пробелов
text_after = re.sub(r"\s+", " ", text_before) # заменяем все последовательности двух и более пробелов на одиночные пробелы
print(text_after)
Консольный вывод будет содержать строку, в которой остались только одиночные пробелы:
Это некоторая строка с пробелами .
В этом примере есть несколько проблем:
Перед точкой в конце стояло несколько пробелов, которые заменяются на один. Однако перед точкой не должно быть пробела вообще.
Последовательность пробелов в начале строки заменяется на один пробел. Однако вначале строки не должно быть пробелов вообще.
Исправить это можно, сделав несколько последовательных преобразований:
import re
text_before = " Это некоторая строка с пробелами . "
text_after = re.sub(r"^\s*|\s*$", "", text_after) # удаляем пробелы в начале и конце строки, используя оператор OR в виде символа |
text_after = re.sub(r"\s+", " ", text_before) # заменяем все повторяющиеся пробелы на одиночный пробел
text_after = re.sub(r"\s*[.]\s*", ".", text_after) # заменяем все точки, окруженные пробелами на просто точки
print(text_after)
Вывод в терминале консоли будет содержать нормальную запись строки без каких-либо лишних пробелов:
Это некоторая строка с пробелами.
В показанных регулярных выражениях указатель \s
обозначает любой пробельный символ, знак +
указывает на повторение один и более раз, символ *
на повторение 0 и более раз, а символ |
является аналогом оператора OR
.
В реальных задачах важно понимать возможную структуру обрабатываемых строк для того, чтобы написать правильный обработчик пробелов. Например, если строка может иметь точки, окруженные пробелами, это придется учесть в логике приложения.
Чем больше нюансов в обрабатываемых строках, тем сложнее будет логика удаления пробелов. Таким образом, для удаления пробелов из строки в Python требуется уникальное решение, создаваемое для каждого конкретного случая.
Для создания сложной логики обработки строк (в данном случае, для удаления пробелов) можно использовать ручной метод — проверка каждого символа в цикле со множеством условий. Такой подход дает больше гибкости и контроля.
В самом тривиальном случае удаление пробелов внутри цикла выглядит так:
# определяем отдельную функцию для более сложной логики обработки строки
def complexRemoval(string):
after = ""
for i in string:
if(not i.isspace()): after += i # функция isspace() проверяет, является ли символ пробелом, и возвращает булевый результат — true или false
return after
text_before = " Это некоторая строка с пробелами . "
text_after = complexRemoval(text_before)
print(text_after)
Консольный вывод будет содержать все символы исходной строки, но без пробелов:
Этонекотораястрокаспробелами.
Очевидно, это не тот результат, который требуется, поэтому логику удаления нужно усложнить:
def complexRemoval(string):
after = ""
wasSpace = True # переменная указывает, был ли предыдущий символ пробелом
for i in string:
if(not i.isspace()): # если не пробел
if(i == '.' and wasSpace): after = after[:len(after)-1] # если попалась точка, а предыдущий символ был пробелом — удаляем его
after += i
wasSpace = False
elif(not wasSpace): # если пробел, но предыдущий не был пробелом
after += i
wasSpace = True
return after
print(complexRemoval(" Это некоторая строка с пробелами . "))
print(complexRemoval("Много разных пробелов бла бла бла . Еще и точка . "))
В консольном выводе мы получим идеально обработанные строки без лишних пробелов:
Это некоторая строка с пробелами.
Много разных пробелов бла бла бла. Еще и точка.
Размещайте Python-проекты в облаке Timeweb Cloud
Язык программирования Python предлагает определенный набор встроенных средств для редактирования строк — например, манипуляции с символами пробела:
Для каждого варианта есть свой набор методов — большую часть из них мы рассмотрели в этом руководстве.