Метод find в Python

Find – это своего рода человек с лупой, который выискивает нужную вещь по дорожке (строке) Python

В статье подробно разбираем метод find() в Python: описание, синтаксис, применение.

Описание метода find()

Функция find() в языке python (питон) используется для поиска первого вхождения символа или подстроки во всей строке, либо только в ее отрезке.

Примечательно, что если в качестве аргумента, который необходимо найти, отправить подстроку, то ошибка не вернется. Вместо этого функция решит найти подстроку в строке python. Конечно, сначала будет казаться, что лучше бы возвращался и начальный и конечный элемент, но в таком случае тогда придется создавать список.

Да и к тому же, если разработчик будет знать размер искомой строки, индекс первого элемента, то он может получить и индекс последнего элемента, прибавив размер подстроки и отняв

1. Метод find работает только со строками, для списков и словарей используются совсем другие методы.

Если же нужная подстрока или буква не были найдены внутри строки, то возвращается значение -1.

Кстати, если вы уже думаете сделать конструкцию, в которой с помощью функции find определяется индекс, а после сразу происходит вывод по этому индексу, то это плохая идея. Если буква не будет найдена, то будет возвращено значение -1 (как мы уже говорили).

Если обратиться к минус первому элементу, то питон вернет самый последний элемент (например, в слово «сайт» элемент с индексом -1 – это «т»). Дело в том, что когда в качестве индекса указывается отрицательное число, то минус исчезает, но отсчет начинается с конца.

Следственно, при работе с find стоит дополнительно использовать условия (о них читайте в предыдущих статьях).

Find – это своего рода человек с лупой, который выискивает нужную вещь по дорожке (строке)
Find – это своего рода человек с лупой, который выискивает нужную вещь по дорожке (строке)

Читайте здесь If-elif-else в Python

Синтаксис

Find не является самостоятельной функцией, а только методом для объекта типа string.

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

Сам синтаксис функции выглядит следующим образом:

s.find(str, start, end)

Вместо «string» необходимо указать строку, в которой происходит поиск, вместо char подставляем букву или подстроку, которые нужно найти. Последние два аргумента необходимы для установки начального и конечного значения, но об этом немного позже. Разберемся на конкретном примере.

Функция возвращает индекс символа
Функция возвращает индекс символа

Поиск символа или подстроки в строке

У нас есть последовательность букв английского алфавита, но только в этой последовательности не все буквы, а потому вручную указать индекс не получится. Необходимо по введенной букве, определить ее индекс и вывести все буквы после этого индекса. И так, как будет выглядеть решение:

alphabet = "abcdfghjmnopqrsuvwxz" # алфавит с пробелами
symbol_for_find = input("Введите начальный символ:")
index_of_symbol = alphabet.find(symbol_for_find) # поиск индекса символа
if (index_of_symbol >= 0): # если метод find нашел символ, а потому не вернул отрицательное число
print(alphabet[index_of_symbol:]) # вывод строки от введенного индекса и до конца
else:
print("Простите, но в нашем псевдоалфавите нет введенной буквы")

Готово. Если бы не find, тогда разработчику пришлось бы создавать цикл while с счетчиком, сверять каждый элемент с введенным пользователем, а после, если символ был найден, выводить его индекс, который находился в счетчике. Не совсем удобно, потому рекомендуем пользоваться только готовой функцией.

Как мы видим, программа работает как часы
Как мы видим, программа работает как часы

А если вспомнить, что с помощью циклов будет проблематично проверить подстроку, то это еще сильнее повышает любовь к встроенным функциям типа этой.

Читайте здесь про методы split и str.rsplit в языке Python.

Кстати, давайте попробуем искать не по символу, а по подстроке. Сразу пример из жизни: вспомните школьные года, когда на некоторых предметах было деление по группам. Представим, что необходимо вывести две части строки.

Первая часть – это первая группа, а вторая – вторая группа. Разделять их будет введённое имя.

Реализация (не забывайте, регистр важен):

students = "Karl, Misha, Olga, Steve, Oliver, Harry, Jone, Damir, Eliot, Mister" split_student = input("Введите имя студента, на котором начинается вторая группа:") 
split_index = students.find(split_student) # получаем разделительный индекс (индекс соответствует первому введенному символу) 
if(split_index >= 0): # проверяем его существование 
print("Первая группа:", students[:split_index - 2]) # выводим первую группу. -2 нужен для того, чтобы убрать лишние запятые в конце 
print("Вторая группа:", students[split_index:]) # выводим вторую группу 
else: print("Студент не найден")

и снова результат на картинке ниже.

Результат выполнения программы
Результат выполнения программы

Невероятно крутой инструмент, и при этом простой в исполнении.

Поиск символа в подстроке со start и end

Периодически возникает необходимость искать только в отдельном отрезке строки. Например, если на вход поступает строка формата: «Запись № 0001 *текст*», то искать нужно только после цифр, так как они не несут никакой ценности.

Или допустим есть строка: «*имена* — студенты, пришедшие на пересдачу».  Зачем обрабатывать эту константную фразу, ведь важны только имена. Так вот, чтобы ограничить отрезок, где будет проверяться элемент, используются необязательные аргументы start и end. Соответственно, start отвечает за начало отрезка строки, а end за конец.

По умолчанию start = 0, а end = -1. Название аргумента указывать необязательно.

То есть, в функции в первую очередь указывается символ для поиска, после начальный элемент, и только после этого конечный элемент.

Рассмотрим пример, когда нужно искать только с определенного элемента:

tasklist = "Задачи на сегодня: Купить продукты, навестить друга, найти работу, отвести машину в ремонт. Успеть бы до 11"
begin_char = tasklist.find(':') # мы знаем, что список начинается с двоеточия
end_char = -15 # убираем 15 последних символов с конца
text = input("Введите задачу, с которой нужно начать отсчет:")
index = tasklist.find(text, begin_char, end_char) # проверка с выбором начала и конца отрезка
if ( index >= 0 ):
	print (tasklist[index:end_char]) # вывести с выбранного индекса и до конца списка (но не строки)
else:
	print ("пункт не найден")
Результат выполнения 
Результат выполнения

Как видно на скриншоте, слово «сегодня» есть в переменной, но оно не было найдено, так как не принадлежит промежутку, указанному при вызове метода, а потому в учет не принималось.

Проверка есть ли символ в строке

Самые смекалистые могли заметить, что обращение к найденному индексу – это не единственная особенность метода find. С помощью него разработчик также может проверить наличие подстроки в переменной. Это действительно так.

Достаточно сделать условие: если find вернул отрицательное число, значит нужной подстроки нет, иначе есть. Однако, это нерационально. Для таких случаев в python предусмотрено ключевое слово «in».

Чтобы проверить, есть ли подстрока в строке необходимо использовать следующий синтаксис:

x = word in string

Если word есть в string, то x присвоится True, иначе False. Рассмотрим на реальном примере:

cities = "Moscow, Novosibirsk, Rostov, Magadan, Peterburg, Donetsk"
word = "Novosibirsk"
word1 = "Krasnodar"
x = word in cities
x1 = word1 in cities
print(x)
print(x1)

Как вы уже догадались, первый вывод будет True, а второй False. Так что на будущее: не придумывайте велосипед, если есть готовая замена.

Метод rfind()

Во всех примерах выше мы могли находить первое вхождение символа или подстроки. Однако, что делать, если считывать необходимо с конца. В таком случае необходимо использовать похожую по написанию функцию rfind.

Она начинает парсинг элементов с конца. И, кстати, нумерует она символы также сначала.

Допустим, если есть переменная из 20 символов, а нужный символ окажется на 18 позиции, то функция и вернет 18, а не 2 (ведь 20 – 18 = 2, а проверяет то она с конца).

Это полезно, главное не запутаться.

И как обычно пример:

string = "Эта простая строка, у которой в конце неожиданно буква ф в слове фольклор появилась"
x = string.rfind('ф')
print(x)

Программа выведет число 65, но если бы мы использовали find, то ответ был бы 55. Потому что тогда программа сначала бы увидела отдельную букву «ф», а после только «ф» в слове «фольклор».

Наглядное описание работы двух методов
Наглядное описание работы двух методов

Вывод

Сначала кажется, что метод find не несет никакой пользы. В будущем в практике часто придется искать индексы элементов по их значению. Например, чтобы делить строки или анализировать содержимое, ну или очищать мусорный контент. Главное научиться, а применение всегда найдется. Благодарим за прочтение.

Айтистанция
Добавить комментарий

Adblock
detector