Find: примеры (PYTHON)

Использование метода 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, могут косвенно влиять на скорость его выполнения.

Расширенные примеры применения

Поиск всех вхождений подстроки в цикле.

Пример python
text = "барабан барабанщик бил в барабан"
sub = "барабан"
pos = -1
while True:
    pos = text.find(sub, pos + 1)
    if pos == -1:
        break
    print(f"Найдено на позиции {pos}")
Найдено на позиции 0
Найдено на позиции 22

Извлечение части строки после определенного маркера.

Пример python
data = "Имя: Алексей, Возраст: 30"
marker = "Возраст: "
start_idx = data.find(marker)
if start_idx != -1:
    age_str = data[start_idx + len(marker):]
    print(age_str) # Может потребоваться дополнительная очистка
30

Использование с условиями и отрицательными индексами для end.

Пример python
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 для нахождения пути к файлу.

Пример python
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

Проверка наличия одного из нескольких вариантов.

Пример python
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

питон find function comments

En
Find Find substring