Методы строк: поиск и проверка содержимого
При работе со строками довольно часто возникает необходимость найти нужное сочетание символов внутри строки, сосчитать количество его повторений либо убедиться, что строка соответствует нужному формату, например, состоит только из чисел или начинается с определённой строки.
proverb = "Семь раз отмерь, один раз отрежь"
print(proverb.index("раз"))
print(proverb.rindex("раз"))
citate = "Казань брал, Астрахань брал, Ревель брал, Шпака — не брал"
print(citate.find("брал"))
print(citate.rfind("брал"))
Поиск подстроки в строке
Для поиска подстроки в строке Python предоставляет два основных метода: str.index()
и str.find()
. Оба метода предназначены для обнаружения первого вхождения указанной подстроки и возвращают индекс начала этого вхождения.
Ключевое различие между этими двумя методами заключается в их поведении, когда подстрока не найдена. Метод str.index()
в такой ситуации вызовет исключение ValueError, что приведёт к прерыванию выполнения программы. В то же время метод str.find()
просто вернёт -1
, и программа дальше продолжит работу.
Методы | str.index(sub, start=0, end=None) |
Описание | Возвращают начальный индекс первого вхождения подстроки sub в строку str |
Параметры | sub – искомая подстрокаНеобязательные параметры: start – индекс начала среза, в котором ищется подстрока, по умолчанию start=0 end – индекс конца среза, в котором ищется подстрока, по умолчанию end=None |
Возвращаемое значение | Целое число |
По умолчанию поиск подстроки осуществляется по всей строке:
proverb = "Век живи — Век учись"
print(proverb.index("Век"))
# Вывод: 0
citate = "Один за всех, все за одного"
print(citate.find("за"))
# Вывод: 5
Но оба метода поддерживают ограничение диапазона поиска с помощью среза [start:end]
:
print(proverb.index("Век", 6, 14))
# Вывод: 11
print(citate.find("за", 15, 21))
# Вывод: 18
В случае отсутствия искомой подстроки в строке метод str.index()
вызовет исключение ValueError, а метод str.find()
вернёт -1
:
print(proverb.index("бездельничай"))
# Ошибка: ValueError: substring not found
print(citate.find("д'Артаньян"))
# Вывод: -1
Так метод str.find()
удобнее в случаях, когда важно избежать возникновения исключений.
Также у обоих методов есть варианты с префиксом "r"
(от right – право), которые начинают поиск не с начала строки, а с конца (справа), поэтому возвращают индекс последнего вхождения подстроки.
Метод |
|
Описание | Возвращает начальный индекс последнего вхождения подстроки sub в строку str |
Параметры | sub – искомая подстрокаНеобязательные параметры: start – индекс начала среза, в котором ищется подстрока, по умолчанию start=0 end – индекс конца среза, в котором ищется подстрока, по умолчанию end=None |
Возвращаемое значение | Целое число |
Если методы str.index()
и str.find()
возвращают наименьший индекс начала подстроки, то методы str.rindex()
и str.rfind()
– наибольший:
proverb = "Семь раз отмерь, один раз отрежь"
print(proverb.index("раз"))
# Вывод: 5
print(proverb.rindex("раз"))
# Вывод: 22
citate = "Казань брал, Астрахань брал, Ревель брал, Шпака — не брал"
print(citate.find("брал"))
# Вывод: 7
print(citate.rfind("брал"))
# Вывод: 53
В случае отсутствия искомой подстроки в строке метод str.rindex()
аналогично вызывает исключение ValueError, а метод str.rfind()
возвращает -1
:
proverb = "Семь раз отмерь, один раз отрежь"
print(proverb.rindex("Восемь"))
# Вывод: ValueError: substring not found
citate = "Казань брал, Астрахань брал, Ревель брал, Шпака — не брал"
print(citate.rfind("захватил"))
# Вывод: -1
Подсчёт количества вхождений подстроки в строку
Когда необходимо не просто найти индекс начала вхождения подстроки, а посчитать общее количество её вхождений, используется метод str.count()
.
Метод | str.count(sub, start=0, end=None) |
Описание | Возвращает количество вхождений подстроки sub в строку str |
Параметры | sub – подсчитываемая подстрокаНеобязательные параметры: start – индекс начала среза, в котором ищется подстрока, по умолчанию start=0 end – индекс конца среза, в котором ищется подстрока, по умолчанию end=None |
Возвращаемое значение | Целое число |
По умолчанию подсчёт вхождений осуществляется по всей строке:
citate = "Неважно, сколько раз вы падали; важно то, сколько раз вы поднимались"
print(citate.count("сколько"))
# Вывод: 2
Но как и поиск, область подсчёта можно ограничить помощью среза [start:end]
:
print(citate.count("сколько", 2, 18))
# Вывод: 1
Проверка содержимого строки
Методы проверки строк помогают определить, включает ли строка в себя определённые типы символов или соответствует ли содержимое строки заданному шаблону, что позволяет сделать необходимые выводы, например, при проверку корректности вводимых пользователем данных. Эти методы возвращают логические значения True
или False
, поэтому их особенно удобно применять внутри условий или циклов для принятия решений в программе.
Проверка регистра символов строки
Проверить регистр всех букв в строке на нижний регистр позволяет метод str.islower()
, а на верхний – str.isupper()
.
Метод | str.islower() |
Описание | Возвращает True , если все буквы в строке str маленькие, иначе – False |
Возвращаемое значение | True или False |
Метод | str.isupper() |
Описание | Возвращает True , если все буквы в строке str заглавные, иначе – False |
Возвращаемое значение | True или False |
Если все буквы строки находятся в проверяемом регистре, то оба метода возвращают True
:
username = input("Введите имя пользователя: ")
if username.islower():
print("хорошее маленькое имя пользователя")
# Ввод: повелитель_кексиков
# Вывод: хорошее маленькое имя пользователя
username = input("Введите имя пользователя: ")
if username.isupper():
print("ХОРОШЕЕ БОЛЬШОЕ ИМЯ ПОЛЬЗОВАТЕЛЯ")
# Ввод: БУЛОЧКА_С_КОРИЦЕЙ
# Вывод: ХОРОШЕЕ БОЛЬШОЕ ИМЯ ПОЛЬЗОВАТЕЛЯ
Проверка на тип символов строки
Для проверки того, являются ли все символы строки только буквами используется метод str.isalpha()
, а только цифрами – метод str.isdigit()
.
Метод | str.isalpha() |
Описание | Возвращает True , если строка str состоит из букв, иначе – False |
Возвращаемое значение | True или False |
Метод | str.isdigit() |
Описание | Возвращает True , если строка str состоит из цифр, иначе – False |
Возвращаемое значение | True или False |
Например, введённое пользователем имя не должно содержать никаких символов, кроме букв, поэтому его можно проверить с помощью метода str.isalpha()
:
name = input("Введите имя: ")
if not last_name.isalpha():
print("Имя может содержать только буквы")
else:
print("Какое хорошее имя!")
# Ввод: Е102-гамма
# Вывод: Имя может содержать только буквы!
Возраст же может представлять собой только число, поэтому для проверки корректности его ввода используем метод str.isdigit()
:
age = input("Введите возраст: ")
if not age.isalpha():
print("Возраст может содержать только цифры")
else:
print("Какой чудесный возраст!")
# Ввод: 100
# Вывод: Какой чудесный возраст!
Но если строка может включать в себя как буквы, так и из цифры, то проверить это можно с помощью метода str.isalnum()
.
Метод | str.isalnum() |
Описание | Возвращает True , если строка str состоит из букв или цифр, иначе – False |
Возвращаемое значение | True или False |
Метод str.isalnum()
возвращает True
, если строка не содержит никаких других символов кроме букв и цифр:
password = input("Введите пароль: ")
if not password.isalnum():
print("Пароль может содержать только буквы или цифры")
else:
print("Это самый лучший пароль на свете!")
# Ввод: qwerty???
# Вывод: Пароль может содержать только буквы или цифры
Обратите внимание, что этот метод не проверят наличие одновременно букв и цифр в строке, так как он вернёт True
как в случае, если строка состоит только из букв, так и только из цифр. То есть его результат совпадает с результатом методов
str.isalpha()
и str.isdigit()
, объединённых оператором логического «ИЛИ»:
status = input("Введите фразу для статуса: ")
if status.isdigit() or status.isalnum():
print("Это самый лучший статус на свете!")
else:
print("Статус может содержать только буквы или цифры!")
# Ввод: Агент007
# Вывод: Это самый лучший статус на свете!
Все методы проверки типа символов в строке возвращают False
, если строка содержит пробелы или другие небуквенно-цифровые символы. Например, если в предыдущем примере мы введём строку "Агент 007"
или "Агент_007"
, то не пройдем проверку и увидим сообщение "Статус может содержать только буквы или цифры!
".
К сожалению, строки не поддерживают встроенные методы проверки на специальные символы, однако кроме проверки наличия буквенно-цифровых символов, строку также можно проверить на то, состоит ли она только из одних пробелов с помощью метода str.isspace()
.
Метод | str.isspace() |
Описание | Возвращает True , если строка str состоит из пробелов, иначе – False |
Возвращаемое значение | True или False |
Данный метод вернёт True
, в том числе, если строка содержит символы табуляции или перевод на новую строку:
username = " \t \n "
print(username.isspace())
# Вывод: True
Проверка начала и конца строки
Методы str.startswith()
и str.endswith()
позволяют проверить строку на на соответствие какому-то шаблону, то есть начинается или заканчивается ли строка указанной подстрокой (префиксом или постфиксом соответственно).
Метод | str.startswith(prefix, start=0, end=None) |
Описание | Возвращает True , если строка str начинается на подстроку prefix , иначе – False |
Параметры | sub – строка-префикс, которой предполагаемо начинается строкаНеобязательные параметры: start – индекс начала среза, в котором проверяется наличие строки-префикса prefix , по умолчанию start=0 end – индекс конца среза, в котором проверяется наличие строки-префикса prefix , по умолчанию end=None |
Возвращаемое значение | True или False |
Метод | str.endswith(suffix, start=0, end=None) |
Описание | Возвращает True , если строка str оканчивается на подстроку suffix , иначе – False |
Параметры | suffix – строка-суффикс, которой предполагаемо оканчивается строка str Необязательные параметры: – индекс начала среза, в котором проверяется наличие строки-постфикса suffix , по умолчанию start=0 end – индекс конца среза, в котором проверяется наличие строки-постфикса suffix , по умолчанию end=None |
Возвращаемое значение | True или False |
Например, можно проверить фамилию по ФИО:
name = input("Введите ФИО: ")
if name.startswith("Романов"):
print("Да это же Романовы!")
elif name.startswith("Рюрикович"):
print("Да это же Рюриковичи!")
# Ввод: Романова Е.А.
# Вывод: Да это же Романовы!
Или проверить расширение файла:
filename = input("Введите полное название файла: ")
if filename.endswith(".py"):
print("Это файл с кодом на Python")
elif filename.endswith(".docx"):
print("Это файл с документом MS Word")
# Ввод: task.py
# Вывод: Это файл с кодом на Python
Подобно методам поиска подстроки, str.startswith()
и str.endswith()
также поддерживают ограничение области поиска начала и конца строки с помощью необязательных параметров start
и end
, задающих срез [start:end]
:
article = "Cамая лучшая шинковка для капусты"
print(article.startswith("Самая", 6))
# Вывод: False
print(article.endswith("капусты", 5, 15))
# Вывод: False
1. Напишите программу, которая ищет первое вхождение слова "мир"
в строке "Привет, мир! Как дела, мир?"
и выводит результат на экран. Поиск должен вестись с 7-го индекса.
2. Какие методы используются для поиска последнего вхождения подстроки в строке? Как они ведут себя, если подстрока не найдена?
3. Напишите программу, которая подсчитывает, сколько раз символ "!"
встречается в строке "Ура!!! Получилось!"
и выводит результат на экран.
4. Что вернут методы str.islower()
и str.isupper()
для строки "Вконтакте"
?
5. Напишите программу, которая преобразует строку "мука,3 яйца,молоко"
в список и выводит его на экран.
Пример входных данных | Пример выходных данных |
---|---|
160789 | Введён корректный почтовый индекс |
34POST | Почтовый индекс должен состоять только из цифр |
985172 | Введён корректный почтовый индекс |
6. Напишите программу, которая проверяет, заканчивается ли имя файла расширением ".txt"
и в зависимости от этого выводит на экран строку "Это текстовый файл"
или "Это не текстовый файл"
.
Пример входных данных | Пример выходных данных |
---|---|
task.txt | Это текстовый файл |
cake.jpeg | Это не текстовый файл |
passwords.txt | Это текстовый файл |