strip(), lstrip() и rstrip() в Python
Метод strip в Python: удаление пробелов и переводов строк по краям, lstrip и rstrip, аргумент chars, отличие от removeprefix, очистка ввода и строк файла.
Содержание · 10 разделов
- Синтаксис strip, lstrip и rstrip
- Что считается пробельным символом
- strip с аргументом chars
- lstrip и rstrip с аргументом
- strip или removeprefix и removesuffix
- Сравнение методов
- Как убрать пробелы внутри строки
- Практические примеры
- Очистка ввода пользователя
- Строки из файла без перевода строки
- Очистка списка строк
- Значения после split
- Частые ошибки
- strip() не изменил строку
- strip удалил «лишние» буквы
- strip() не убрал пробелы в середине
- AttributeError: ‘list’ object has no attribute ‘strip’
- AttributeError: ‘NoneType’ object has no attribute ‘strip’
- Частые вопросы
- Есть ли в Python функция trim()?
- Почему strip() не убрал невидимый символ в начале файла?
- Как убрать по краям и пробелы, и знаки препинания?
- Как убрать кавычки вокруг строки?
- Как удалить только последний символ строки?
- Итог
Метод strip() в Python убирает пробельные символы в начале и в конце строки и возвращает новую строку. Короткий ответ: " текст \n".strip() вернёт 'текст'. lstrip() чистит только левый край, rstrip() — только правый, а аргумент задаёт набор удаляемых символов: "***важно***".strip("*") даст 'важно'.
Ниже — как работает strip() без аргументов и с аргументом, чем strip() отличается от removeprefix() и removesuffix(), как очистить ввод пользователя и строки файла и какие ошибки встречаются чаще всего. Примеры проверены на Python 3.12.
Синтаксис strip, lstrip и rstrip
str.strip(chars=None)
str.lstrip(chars=None)
str.rstrip(chars=None)
- Без аргумента (или с
None) удаляются пробельные символы: пробел,\t,\n,\rи другие. - С аргументом
charsудаляются любые символы из этой строки — в любом порядке и количестве. - Символы удаляются только по краям. Середина строки не меняется.
s = " Привет, мир! "
print(repr(s.strip())) # → 'Привет, мир!'
print(repr(s.lstrip())) # → 'Привет, мир! '
print(repr(s.rstrip())) # → ' Привет, мир!'
print(repr(s)) # → ' Привет, мир! '
repr() в примерах показывает кавычки, чтобы были видны оставшиеся пробелы. Исходная строка s не изменилась: строки в Python неизменяемы, а методы возвращают новые объекты. Подробнее — в статье о строках в Python.
Что считается пробельным символом
Без аргумента strip() удаляет всё, для чего str.isspace() возвращает True. Это не только обычный пробел:
raw = "\t\n текст \r\n"
print(repr(raw.strip())) # → 'текст'
print(repr("\xa0цена\xa0".strip())) # → 'цена' (неразрывный пробел тоже удаляется)
print(repr("\u200bзнак\u200b".strip())) # → '\u200bзнак\u200b'
Неразрывный пробел (\xa0), который часто попадает в текст из Word и с веб-страниц, strip() убирает. А вот символ нулевой ширины (\u200b) пробельным не считается и остаётся — его удаляют явно: s.replace("\u200b", "").
strip с аргументом chars
Аргумент задаёт набор символов. Python отрезает с краёв все символы, которые входят в набор, пока не встретит символ не из набора:
print("***важно***".strip("*")) # → важно
print("--==заголовок==--".strip("-=")) # → заголовок
print("www.example.com".strip("cmowz.")) # → example
В последнем примере слева удалились w, w, w, ., справа — m, o, c, .. Порядок символов в аргументе не важен.
lstrip и rstrip с аргументом
Односторонние версии полезны для чисел и путей:
print("0001200".lstrip("0")) # → 1200 (ведущие нули)
print("0001200".rstrip("0")) # → 00012
print("3.1400".rstrip("0").rstrip(".")) # → 3.14 (лишние нули дробной части)
print("5.000".rstrip("0").rstrip(".")) # → 5
print("https://site.ru/".rstrip("/")) # → https://site.ru
Для форматирования чисел надёжнее f-строки и format() — см. статью о преобразовании числа в строку. Но для готовых строк из файла или API цепочка rstrip — быстрый вариант.
strip или removeprefix и removesuffix
Частая ошибка — пытаться удалить префикс или расширение через strip(). Поскольку аргумент — набор символов, результат бывает неожиданным:
print("python.py".strip(".py")) # → thon
print("test_settings".lstrip("test_")) # → ings
В первом случае с начала удалились p и y из слова «python», с конца — .py, во втором — все буквы из набора t, e, s, _. Для удаления точной подстроки с начала или с конца в Python 3.9 появились removeprefix() и removesuffix():
print("python.py".removesuffix(".py")) # → python
print("test_settings".removeprefix("test_")) # → settings
print("report.pdf".removesuffix(".txt")) # → report.pdf (суффикса нет — строка без изменений)
Если нужно убрать префикс внутри строки или все его вхождения, подойдёт replace().
Сравнение методов
| Метод | Что удаляет | Пример → результат |
|---|---|---|
strip() | пробельные символы с обоих краёв | " a b ".strip() → 'a b' |
lstrip() | пробельные символы слева | " a ".lstrip() → 'a ' |
rstrip() | пробельные символы справа | "a\n".rstrip() → 'a' |
strip(chars) | любые символы из набора chars с краёв | "xxaxx".strip("x") → 'a' |
removeprefix(p) | точную подстроку p в начале (один раз) | "test_a".removeprefix("test_") → 'a' |
removesuffix(s) | точную подстроку s в конце (один раз) | "a.py".removesuffix(".py") → 'a' |
replace(" ", "") | все пробелы, включая внутренние | " a b ".replace(" ", "") → 'ab' |
" ".join(s.split()) | пробелы по краям и повторы внутри | " ".join(" a b ".split()) → 'a b' |
Как убрать пробелы внутри строки
strip() внутренние пробелы не трогает. Если между словами несколько пробелов, сожмите их через split() и join() или удалите все через replace():
s = " много пробелов внутри "
print(repr(s.strip())) # → 'много пробелов внутри'
print(repr(" ".join(s.split()))) # → 'много пробелов внутри'
print(repr(s.replace(" ", ""))) # → 'многопробеловвнутри'
split() без аргументов делит по любым пробельным символам и отбрасывает пустые части, а join собирает слова обратно через один пробел.
Практические примеры
Очистка ввода пользователя
input() возвращает строку как есть, с пробелами, которые пользователь мог случайно ввести. Чистите ввод сразу и проверяйте, что он не пустой:
name = input("Имя: ").strip()
if not name:
print("Пустой ввод")
Строка из одних пробелов после strip() становится пустой, а пустая строка в условии ложна. В Django формы делают это автоматически: у forms.CharField параметр strip=True по умолчанию — подробнее в статье о формах Django.
Строки из файла без перевода строки
При чтении файла каждая строка заканчивается символом \n. Его удаляют через rstrip("\n") — так пробелы в начале строки сохранятся:
with open("names.txt", encoding="utf-8") as f:
names = [line.rstrip("\n") for line in f]
print(names) # → ['Анна', 'Иван', '', 'Олег']
Для сравнения, f.readlines() для того же файла вернёт ['Анна\n', 'Иван\n', '\n', 'Олег\n']. Если пробелы по краям не нужны, используйте strip(), а пустые строки отфильтруйте условием в генераторе.
Очистка списка строк
lines = [" Анна\n", "Иван \n", "\n", " Олег"]
print([line.strip() for line in lines]) # → ['Анна', 'Иван', '', 'Олег']
print([line.strip() for line in lines if line.strip()]) # → ['Анна', 'Иван', 'Олег']
print(list(map(str.strip, [" a ", " b"]))) # → ['a', 'b']
Значения после split
После split(",") вокруг значений остаются пробелы — уберите их в том же генераторе:
raw = "Python , Django, FastAPI "
print([t.strip() for t in raw.split(",")]) # → ['Python', 'Django', 'FastAPI']
Подробнее о разделении строк — в статье о методе split.
Частые ошибки
strip() не изменил строку
s = " text "
s.strip()
print(repr(s)) # → ' text '
s = s.strip()
print(repr(s)) # → 'text'
Метод возвращает новую строку. Присвойте результат переменной.
strip удалил «лишние» буквы
strip(".py"), lstrip("http://") и похожие вызовы удаляют символы из набора, а не подстроку, и могут «съесть» начало или конец слова. Для точного префикса и суффикса используйте removeprefix() и removesuffix().
strip() не убрал пробелы в середине
Так и задумано: метод работает только с краями строки. Используйте " ".join(s.split()) или replace().
AttributeError: ‘list’ object has no attribute ‘strip’
strip() вызван у списка — например, у результата readlines() или split(). Применяйте метод к каждому элементу: [x.strip() for x in items].
AttributeError: ‘NoneType’ object has no attribute ‘strip’
Переменная содержит None — например, функция ничего не вернула или dict.get() не нашёл ключ. Проверьте значение перед вызовом или подставьте пустую строку: (value or "").strip(). Как читать такие сообщения, рассказано в статье о traceback и ошибках Python.
Частые вопросы
Есть ли в Python функция trim()?
Нет, её роль выполняют методы строки: strip() — аналог trim() из JavaScript и PHP, lstrip() и rstrip() — аналоги trimStart() и trimEnd(). Отдельной функции для этого в Python нет.
Почему strip() не убрал невидимый символ в начале файла?
Скорее всего, это BOM (\ufeff) — метка, которую добавляют некоторые редакторы, например Блокнот Windows при сохранении в «UTF-8 с BOM». Пробельным символом он не считается. Откройте файл в кодировке utf-8-sig, и метка исчезнет при чтении:
with open("data.csv", encoding="utf-8") as f:
print(repr(f.readline().strip())) # → '\ufeffid,name'
with open("data.csv", encoding="utf-8-sig") as f:
print(repr(f.readline().strip())) # → 'id,name'
Как убрать по краям и пробелы, и знаки препинания?
Передайте в strip() все нужные символы одной строкой. Готовые наборы есть в модуле string:
import string
print(" — Привет, мир!!! ".strip(string.whitespace + string.punctuation + "—")) # → Привет, мир
Знаки препинания внутри строки останутся на месте. Тире добавлено отдельно: в string.punctuation только символы ASCII.
Как убрать кавычки вокруг строки?
s.strip('"') удалит все кавычки по краям, сколько бы их ни было. Если нужно снять ровно одну пару, проверьте края и возьмите срез:
s = '""цитата""'
print(s.strip('"')) # → цитата
if s.startswith('"') and s.endswith('"'):
print(s[1:-1]) # → "цитата"
Как удалить только последний символ строки?
rstrip(",") удалит все запятые в конце подряд. Чтобы убрать ровно один символ, используйте срез s[:-1], а для конкретного окончания — removesuffix():
s = "1,2,3,,"
print(s.rstrip(",")) # → 1,2,3
print(s[:-1]) # → 1,2,3,
print(s.removesuffix(",")) # → 1,2,3,
Итог
strip() убирает пробелы и переводы строк по краям, lstrip() и rstrip() — с одной стороны, а аргумент задаёт набор символов, а не подстроку. Для точного префикса и суффикса используйте removeprefix() и removesuffix(), для пробелов внутри — split() и join(). Другие методы строк собраны в статье о строках в Python и в шпаргалке по синтаксису Python.
- #Python
- #strip
- #Строки
- #Синтаксис