Find: примеры (PYTHON)
find(sub[, start[, end]]): intФункция find() в Python для поиска подстрок
Метод str.find() в Python применяется для поиска первой позиции подстроки внутри исходной строки. Его основное использование связано с определением наличия фрагмента текста и получением его индекса. Этот метод не изменяет исходную строку.
Аргументы функции:
- sub (обязательный): Подстрока, которую требуется найти. Должна быть строкой.
- start (необязательный): Индекс начала поиска в исходной строке. Поиск начинается с этой позиции. Значение по умолчанию - 0.
- end (необязательный): Индекс окончания поиска. Поиск выполняется до позиции
end-1. Значение по умолчанию - длина строки.
Возвращаемое значение:
- Метод возвращает целое число - индекс первого вхождения подстроки
subв срезе строкиstr[start:end]. - Если подстрока не обнаружена, возвращается значение
-1. Это отличаетfind()от методаindex(), который в аналогичной ситуации вызывает исключениеValueError.
Простые примеры использования
Пример поиска с параметрами по умолчанию.
text = "Программирование на Python"
result = text.find("Python")
print(result)18
Пример, когда подстрока не найдена.
text = "Программирование на Python"
result = text.find("Java")
print(result)-1
Пример использования параметров start и end.
text = "яблоко яблоко"
# Поиск второго слова "яблоко"
result = text.find("яблоко", 2)
print(result)7
Ограничение области поиска с помощью end.
text = "abcdef abcdef"
result = text.find("abc", 0, 5)
print(result)0
Похожие методы строк в Python
- str.index(): Функциональность аналогична
find(), но вызывает исключениеValueErrorпри неудачном поиске. Ее применяют, когда отсутствие подстроки считается ошибкой. - str.rfind(): Осуществляет поиск последнего вхождения подстроки. Возвращает самый высокий индекс.
- str.rindex(): Сочетает логику
index()иrfind(). Находит последнее вхождение или вызывает исключение. - Оператор in и метод str.__contains__(): Проверяют наличие подстроки, возвращая
TrueилиFalse, но не дают информации о позиции. Оптимальны для простых проверок. - Регулярные выражения (re.search()): Используют для сложных паттернов поиска. Медленнее, но мощнее для нетривиальных задач.
Метод find() чаще выбирают для безопасного поиска позиции, когда возможен отрицательный результат, и его не требуется обрабатывать как исключительную ситуацию.
Распространенные ошибки при использовании
Интерпретация возвращаемого значения -1 как истинного. Это может привести к логическим ошибкам, так как -1 в булевом контексте считается True.
text = "Пример"
if text.find("Python"): # Условие будет True, т.к. find вернул -1
print("Подстрока найдена!")
else:
print("Подстрока не найдена.")Подстрока найдена!
Правильная проверка.
if text.find("Python") != -1:
print("Найдена")
else:
print("Не найдена")Не найдена
Передача аргументов start и end в неправильном порядке или с некорректными значениями. Отрицательные индексы допустимы и интерпретируются как отсчет с конца строки.
text = "Python"
print(text.find("P", 10)) # Поиск начинается за пределами строки
print(text.find("P", -2)) # Отрицательный start-1 0
Изменения в последних версиях Python
Специфических изменений в поведении или сигнатуре метода str.find() в последних основных версиях Python (3.x) не происходило. Это стабильный и давно существующий метод. Однако общие изменения, связанные с производительностью и внутренней реализацией строк в CPython, могут косвенно влиять на скорость его выполнения.
Расширенные примеры применения
Поиск всех вхождений подстроки в цикле.
text = "барабан барабанщик бил в барабан"
sub = "барабан"
pos = -1
while True:
pos = text.find(sub, pos + 1)
if pos == -1:
break
print(f"Найдено на позиции {pos}")Найдено на позиции 0 Найдено на позиции 22
Извлечение части строки после определенного маркера.
data = "Имя: Алексей, Возраст: 30"
marker = "Возраст: "
start_idx = data.find(marker)
if start_idx != -1:
age_str = data[start_idx + len(marker):]
print(age_str) # Может потребоваться дополнительная очистка30
Использование с условиями и отрицательными индексами для end.
text = "Python 3.11 и Python 3.12"
# Поиск только в первой половине строки
mid = len(text) // 2
first_half_search = text.find("Python", 0, mid)
second_half_search = text.find("Python", mid)
print(f"В первой половине: {first_half_search}")
print(f"Во второй половине: {second_half_search}")В первой половине: 0 Во второй половине: 14
Поиск с конца строки, используя rfind для нахождения пути к файлу.
filepath = "/home/user/docs/report.txt"
last_slash = filepath.rfind("/")
filename = filepath[last_slash + 1:] if last_slash != -1 else filepath
print(filename)report.txt
Проверка наличия одного из нескольких вариантов.
user_agent = "Mozilla/5.0 (Linux; Android 10)"
keywords = ["Android", "iPhone", "Windows"]
found = any(user_agent.find(kw) != -1 for kw in keywords)
print(f"Найдено ключевое слово: {found}")Найдено ключевое слово: True
Поиск подстрок в других языках
- JavaScript: Методы
indexOf()иlastIndexOf(). Работают аналогичноfind()иrfind(), возвращая-1при неудаче.let text = "Hello World"; console.log(text.indexOf("World"));6
- Java: Метод
String.indexOf(). Поведение идентично Python.String text = "Hello World"; System.out.println(text.indexOf("World"));6
- PHP: Функция
strpos(). Возвращает позицию илиfalse. Важно использовать строгое сравнение.$text = "Hello World"; echo strpos($text, "World");6
- C#: Метод
String.IndexOf(). Имеет перегрузки для указания начала поиска и правил сравнения.string text = "Hello World"; Console.WriteLine(text.IndexOf("World"));6
- SQL (LIKE, POSITION): Для поиска по шаблону используют оператор
LIKE, а для позиции - функциюPOSITION()илиINSTR().SELECT POSITION('orld' IN 'Hello World');7
- Go: Функция
strings.Index()из пакетаstrings.package main import ( "fmt" "strings" ) func main() { fmt.Println(strings.Index("Hello World", "World")) }6
- Kotlin: Метод
indexOf()у строк.val text = "Hello World" println(text.indexOf("World"))6