undo
search menu close

Методы строк: поиск и проверка содержимого

📅 2 мая 2025 г. 21:08

При работе со строками довольно часто возникает необходимость найти нужное сочетание символов внутри строки, сосчитать количество его повторений либо убедиться, что строка соответствует нужному формату, например, состоит только из чисел или начинается с определённой строки.

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)
str.find(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 – право), которые начинают поиск не с начала строки, а с конца (справа), поэтому возвращают индекс последнего вхождения подстроки.

Метод str.rindex(sub, start=0, end=None)
str.rfind(sub, start=0, end=None)
Описание Возвращает начальный индекс последнего вхождения подстроки 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

Необязательные параметры:
start – индекс начала среза, в котором проверяется наличие строки-постфикса 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 Это текстовый файл
 
Ответ
arrow_back_ios Назад
Дальше arrow_forward_ios

 💬 0 комментариев
person
email