← Назад к вопросам
Замена пробелов в строке
1.3 Junior🔥 271 комментариев
#Python Core
Условие
Напишите функцию, которая заменяет все пробелы в строке на заданную подстроку.
Пример
replace_spaces("hello world", "%20") → "hello%20world" replace_spaces("Mr John Smith", "@40") → "Mr@40John@40Smith"
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Замена пробелов в строке
Задача замены пробелов на другую подстроку — это базовая операция обработки строк, часто встречающаяся при кодировании URL, форматировании данных и обработке текста. В Python есть несколько способов решить эту задачу с разными уровнями оптимизации.
Простое решение: встроенный метод replace()
def replace_spaces(text: str, replacement: str) -> str:
"""
Заменяет все пробелы в строке на заданную подстроку.
Args:
text: Исходная строка
replacement: Подстрока для замены
Returns:
Строка с замененными пробелами
Временная сложность: O(n)
Пространственная сложность: O(n)
"""
return text.replace(" ", replacement)
# Примеры
print(replace_spaces("hello world", "%20")) # hello%20world
print(replace_spaces("Mr John Smith", "@40")) # Mr@40John@40Smith
print(replace_spaces("a b c d", "_")) # a_b_c_d
print(replace_spaces("no spaces here", "%20")) # no%20spaces%20here
print(replace_spaces("", "%20")) # (пустая строка)
Решение через join() и split()
def replace_spaces_join(text: str, replacement: str) -> str:
"""
Замена пробелов с использованием split() и join().
Более гибко для работы с разными типами пробелов.
"""
# split() без аргументов разделяет по любым пробельным символам
# и удаляет пустые строки
return replacement.join(text.split())
# Примеры
print(replace_spaces_join("hello world", "%20")) # hello%20world
print(replace_spaces_join("Mr John Smith", "@40")) # Mr@40John@40Smith
print(replace_spaces_join("a b c", "_")) # a_b_c (двойные пробелы тоже заменяются)
print(replace_spaces_join(" hello ", "%20")) # hello (удаляет ведущие и хвостовые пробелы)
Решение с использованием регулярных выражений
import re
def replace_spaces_regex(text: str, replacement: str) -> str:
"""
Замена пробелов с использованием регулярных выражений.
Полезно для более сложных паттернов.
"""
# \s+ — один или несколько пробельных символов
return re.sub(r' ', replacement, text) # Точное совпадение со спецификацией
# Или для замены любых пробельных символов
def replace_whitespace_regex(text: str, replacement: str) -> str:
"""Заменяет любые пробельные символы (пробелы, табуляции, переводы строк и т.д.)"""
return re.sub(r'\s', replacement, text)
# Примеры
print(replace_spaces_regex("hello world", "%20")) # hello%20world
print(replace_spaces_regex("Mr John Smith", "@40")) # Mr@40John@40Smith
print(replace_whitespace_regex("hello\tworld\n", "%20")) # hello%20world%20
Решение через list comprehension и join()
def replace_spaces_comprehension(text: str, replacement: str) -> str:
"""
Замена пробелов через list comprehension.
Более явно показывает логику.
"""
return replacement.join([char if char != ' ' else replacement for char in text])
# Примеры
print(replace_spaces_comprehension("hello world", "%20")) # hello%20world
print(replace_spaces_comprehension("a b c", "_")) # a_b_c
Решение с ручным проходом (для понимания алгоритма)
def replace_spaces_manual(text: str, replacement: str) -> str:
"""
Ручное итерирование по строке.
Хорошо для понимания алгоритма и собеседований.
"""
result = []
for char in text:
if char == ' ':
result.append(replacement)
else:
result.append(char)
return ''.join(result)
# Примеры
print(replace_spaces_manual("hello world", "%20")) # hello%20world
print(replace_spaces_manual("Mr John Smith", "@40")) # Mr@40John@40Smith
In-place решение для массива символов (классическая задача на собеседованиях)
def replace_spaces_inplace(chars: list[str], replacement: str) -> list[str]:
"""
Заменяет пробелы в массиве символов (имитирует in-place в работе с массивом).
Требует предварительного расширения массива.
"""
space_count = chars.count(' ')
original_length = len(chars)
new_length = original_length + space_count * (len(replacement) - 1)
# Расширяем список
chars.extend([''] * (new_length - original_length))
# Проходим справа налево, чтобы не перезаписать данные
write_index = new_length - 1
read_index = original_length - 1
while read_index >= 0:
if chars[read_index] == ' ':
# Вставляем replacement справа налево
for i in range(len(replacement) - 1, -1, -1):
chars[write_index] = replacement[i]
write_index -= 1
else:
chars[write_index] = chars[read_index]
write_index -= 1
read_index -= 1
return chars
# Пример
chars = list("hello world")
result = replace_spaces_inplace(chars, "%20")
print(''.join(result)) # hello%20world
Обработка граничных случаев
def replace_spaces_robust(text: str, replacement: str) -> str:
"""
Устойчивое решение с проверкой граничных случаев.
"""
# Проверка входных данных
if not isinstance(text, str):
raise TypeError("text must be a string")
if not isinstance(replacement, str):
raise TypeError("replacement must be a string")
# Граничные случаи
if not text: # Пустая строка
return text
if not replacement: # Пустая замена (удаление пробелов)
return text.replace(" ", "")
return text.replace(" ", replacement)
# Тесты граничных случаев
test_cases = [
("hello world", "%20", "hello%20world"),
("Mr John Smith", "@40", "Mr@40John@40Smith"),
("", "%20", ""),
("nospaces", "%20", "nospaces"),
(" ", "%20", "%20%20%20"),
("a b c", "", "abc"),
]
for text, replacement, expected in test_cases:
result = replace_spaces_robust(text, replacement)
status = "✓" if result == expected else "✗"
print(f"{status} replace_spaces('{text}', '{replacement}') = '{result}'")
Сравнение подходов
| Метод | Временная сложность | Память | Простота | Универсальность |
|---|---|---|---|---|
| replace() | O(n) | O(n) | ✓ Легко | Простые замены |
| split() + join() | O(n) | O(n) | ✓ Легко | Универсально |
| Регулярные выражения | O(n) | O(n) | ✗ Сложнее | Очень универсально |
| List comprehension | O(n) | O(n) | ✓ Понятно | Хорошо |
| Ручной проход | O(n) | O(n) | ✗ Много кода | Контролируемо |
Производительность
import time
text = "hello world test string with spaces" * 1000
replacement = "%20"
# replace()
start = time.time()
for _ in range(10000):
_ = replace_spaces(text, replacement)
print(f"replace(): {time.time() - start:.4f}s")
# join() + split()
start = time.time()
for _ in range(10000):
_ = replace_spaces_join(text, replacement)
print(f"join(): {time.time() - start:.4f}s")
# replace_all выигрывает благодаря оптимизации на уровне C
Рекомендация
Для большинства случаев используйте встроенный метод replace() — он оптимален, читаем и написан на C:
def replace_spaces(text: str, replacement: str) -> str:
"""Оптимальное решение"""
return text.replace(" ", replacement)
Это решение простое, быстрое и стандартное в Python.