Django-Admin.ru

strip(), lstrip() и rstrip() в Python

Метод strip в Python: удаление пробелов и переводов строк по краям, lstrip и rstrip, аргумент chars, отличие от removeprefix, очистка ввода и строк файла.

Редакция Django-Admin.ru
· обновлено · 8 мин чтения

Содержание · 10 разделов
  1. Синтаксис strip, lstrip и rstrip
  2. Что считается пробельным символом
  3. strip с аргументом chars
  4. lstrip и rstrip с аргументом
  5. strip или removeprefix и removesuffix
  6. Сравнение методов
  7. Как убрать пробелы внутри строки
  8. Практические примеры
  9. Очистка ввода пользователя
  10. Строки из файла без перевода строки
  11. Очистка списка строк
  12. Значения после split
  13. Частые ошибки
  14. strip() не изменил строку
  15. strip удалил «лишние» буквы
  16. strip() не убрал пробелы в середине
  17. AttributeError: ‘list’ object has no attribute ‘strip’
  18. AttributeError: ‘NoneType’ object has no attribute ‘strip’
  19. Частые вопросы
  20. Есть ли в Python функция trim()?
  21. Почему strip() не убрал невидимый символ в начале файла?
  22. Как убрать по краям и пробелы, и знаки препинания?
  23. Как убрать кавычки вокруг строки?
  24. Как удалить только последний символ строки?
  25. Итог

Метод 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
  • #Строки
  • #Синтаксис
↑ ↓ выборEnter открытьEsc закрыть