Функции для работы со строками

Что делать если написали программу которая спрашивает оператора имя, но оказалось что ею пользуются не очень опытные пользователи. Обычно введеные пользовательские данные содержат лишние пробелы, имя может быть только маленькими буквами или заглавными, некоторые не любят вводить текст и просто вбивают 111. Есть ли способы изменить строку?

На самом деле объект строки в Python сам по себе достаточно мощный инструмент.

Можно воспользоваться встроенной функцией dir для того чтобы посмотреть что хранится внутри объекта строки:

>>> text = "some text"
>>> dir(text)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', 
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', 
'__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', 
'__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', 
'__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', 
'__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 
'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 
'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 
'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 
'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

Это список методов класса str и выглядит он внушительно. Для начала можно вспомнить, что если какой-то объект начинается и заканчивается с двойного подчеркивания, то он для внутреннего использования. Остальные это методы экземпляра класса строки которыми можно пользоваться. Рассмотрим пару примеров:

>>> "some text".capitalize()
'Some text'
>>> "text".center(10, '*')
'***text***'
>>> "text".count('t')
2
>>> "some text".title()
'Some Text'

Встроенная помощь

В Python встроена справка по каждому методу встроенной функции и ее можно вызвать в интерактивном режиме указав объект по которому вы хотите получить помощь help("text".title). Обратите внимание, что есть большая разница между help("text".title) и help("text".title()). В первом случае вы вызываете справку по методу .title, а во втором по результату выполнения метода, который возвращает строковый объект.

Вызов помощи через help вызывает специальный режим подсказки, по которому можно ходить стрелками вверх и вниз, выход клавиша Q.

Методы для работы со строками

Поиск по строке, эти методы имеют параметры (str, start, end), где str подстрока для поиска, а start и end диапазон в котором производится поиск:

Метод Описание
str.find Возвращает позицию первого вхождения или -1
str.rfind Возвращает позицию последнего вхождения или -1
str.index Возвращает позицию первого вхождения или вызывает ValueError
str.rindex Возвращает позицию последнего вхождения или вызывает ValueError
str.count Возвращает количество непересекающихся вхождений подстроки

Проверка содержимого строки, эти методы не требуют дополнительных параметров и возвращают True или False при проверке условий:

Метод Описание
str.isdigit() Строка состоит только из цифр
str.isalpha() Строка состоит только из букв
str.isalnum() Строка состоит только из цифр и букв
str.islower() Строка состоит только из символов в нижнем регистре
str.isupper() Строка состоит только из символов в верхнем регистре
str.isspace() Строка состоит только из неотображаемых символов (1)
str.istitle() Начинаются ли слова в строке с заглавной буквы
str.startswith(subs) Начинается ли строка с подстроки subs
str.endswith(subs) Заканчивается ли строка подстрокой subs
  1. Неотображаемые символы: пробел, перевод страницы (\f), новая строка (\n), перевод каретки (\r), табуляция (\t) и вертикальная табуляция (\v).

Модификации строки:

Метод Описание
str.upper() Заменяет все символы на заглавные
str.lower() Заменяет все символы на строчные
str.join(iter) Использует текущую строку как связку для всех элементов списка
str.capitalize() Переводит первый символ строки в верхний регистр, а все остальные в нижний
str.center(width, fill=" ") Дополняет строку символами fill так чтобы строка была по центру
str.expandtabs(tabsize=8) Заменяет символы табуляции (\t) на пробелы, ширина табуляции tabsize
str.lstrip([chars]) Удаление символов chars в начале строки, по умолчанию пробелов
str.rstrip([chars]) Удаление символов chars в конце строки, по умолчанию пробелов
str.strip([chars]) Удаление символов chars в начале и в конце строки, по умолчанию пробелов
str.swapcase() Меняет регистр букв, строчные в заглавные и наоборот
str.title() Делает первую букву каждого слова заглавной и остальные строчными до конца слова
str.zfill(width) Заполняет строку нулями до длинны width
str.ljust(width, fillchar=" ") Дополняет строку символами fillchar до длинны width
str.rjust(width, fillchar=" ") Заполняет строку справа символами fillchar до длинны width
str.format(*args, **kwargs) Форматирование строки (1)
  1. Один из следующих уроков посвящен вопросам форматирования строки.

Так же есть несколько встроенных функций которые могут быть полезными в работе со строками:

Функция Описание
len(obj) Возвращает длинну строки в символах
ord(C) Возвращает номер символа из траблицы символов Юникод, обратная операция chr
chr(N) Возвращает символ по Юникод-номеру символа, обратная операция ord
format(value, spec) То же самое, что и str.format

Разбиение строк на подстроки:

Метод Описание
str.split(sep) Разбивает строку на столько частей сколько раз встречается разделитель sep
str.splitlines() Разбивает строку на отдельные строки каждый раз когда встречается символ новой строки
str.partition(sep) Ищет sep с начала строки и разбивает на 3 части: до подстроки, подстрока и остаток
str.rpartition(sep) С конца строки ищет sep и разбивает строку на 3 части: до подстроки, подстрока и остаток
str[start:end:step] Извлечение среза от start до end с шагом step
str[N] Обращение по индексу, получить символ строки в позиции N, счет начинается с 0

В официальной документации есть еще дополнительные методы для более узких задач.

Последовательная обработка с помощью методов строки

Если метод или функция обработки строки возвращает строку, то у этого объекта тоже есть те же самые методы. Благодаря этому можно выстраивать последовательную обработку одним выражением продолжая преобразования вызывая нужный метод у результата предыдущего или подставляя результат на вход следующей функции.

Например, мы хотим сделать симпатичное имя файла из строки введеной пользователем:

>>> title = "Мама мыла раму"
>>> title.split()
['Мама', 'мыла', 'раму']
>>> title.lower().split()
['мама', 'мыла', 'раму']
>>> "_".join(title.lower().split())
'мама_мыла_раму'
>>> "_".join(title.lower().split()) + ".txt"
'мама_мыла_раму.txt'

Строки неизменны

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

>>> s = "ошипка"
>>> s[3] = "б"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

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

>>> id(s)
4357736632
>>> s = s.title()
>>> s
'Привет'
>>> id(s)
4358651552

Ссылки