Поиск подстроки в строке с помощью find в Python

Раздел: Основы Python -> Строки

Основное решение: метод find()

Метод str.find(sub[, start[, end]]) возвращает индекс первого вхождения подстроки sub в строку. Если подстрока не найдена, возвращается -1. Это наиболее эффективный способ проверить наличие подстроки без прерывания программы (в отличие от index()).

text = 'Привет, мир! Python - лучший язык.'
position = text.find('мир')
print(position)  # 8

Python strip (метод strip в python)

8

Python повторить строку (повторение строки в python)

Параметры start и end ограничивают поиск срезами строки (по умолчанию 0 и len(s)).

text = 'abcabcabc'
pos = text.find('abc', 4)
print(pos)  # 6

Tuple в str python (преобразование кортежа в строку в python)

6

Python объект в строку (преобразование объекта в строку в python)

Альтернативные решения

Как найти подстроку и получить её индекс (с возможностью исключения)?

Метод str.index(sub[, start[, end]]) работает как find, но генерирует исключение ValueError при отсутствии подстроки. Подходит, когда отсутствие подстроки является критической ошибкой.

try:
    idx = 'Hello, world!'.index('world')
    print(idx)  # 7
except ValueError:
    print('Подстрока не найдена')

Python convert string (преобразование строк в python)

Как выполнить поиск справа налево?

Методы str.rfind(sub) и str.rindex(sub) возвращают индекс последнего вхождения подстроки. Они полезны при анализе путей файлов или URL.

path = '/home/user/docs/report.pdf'
last_slash = path.rfind('/')
print(last_slash)  # 20
print(path[last_slash+1:])  # report.pdf

Python str to bytes (преобразование строки в байты в python)

Как проверить только наличие подстроки без индекса?

Оператор in возвращает True или False. Это самый читаемый способ для простых проверок.

if 'Python' in 'Я изучаю Python':
    print('Да')  # выведет 'Да'

функция разделить python (разделение строки на список в python)

Как искать подстроку по сложному шаблону?

Модуль re (регулярные выражения) позволяет искать по маске. Например, найти все числа в строке.

import re
text = 'Цена: 200 руб, скидка 15%'
match = re.search(r'\d+', text)
if match:
    print(match.group())  # 200

вывести символ строки python (вывод символа строки в python)

Типичные проблемы и их решение

Путаница между -1 и 0

Если искомая подстрока находится в самом начале строки, find() возвращает 0. Новички ошибочно воспринимают 0 как отсутствие подстроки. Следует всегда проверять if pos != -1, а не if pos.

text = 'abc'
pos = text.find('a')
if pos != -1:
    print('Найдено на позиции', pos)  # правильная проверка

вывести длину строки python (вывести длину строки в python)

Исключение ValueError при использовании index()

Метод index() выбрасывает исключение, если подстрока отсутствует. Без обработки try...except программа аварийно завершится. Использование find() безопаснее, если нужна проверка.

Регистрозависимость

Все описанные методы (find, index, in) чувствительны к регистру. Для поиска без учёта регистра предварительно преобразуйте строку и подстроку к одному регистру через lower() или upper().

text = 'Python'
print(text.lower().find('python'))  # 0

вывести элемент строки python (вывод конкретного символа строки по индексу в python)

Пустая подстрока

Если искомая подстрока пустая (''), find() возвращает 0 (начало строки), так как пустая строка считается присутствующей везде. Это может вызвать неожиданное поведение.

print('abc'.find(''))  # 0
- Python первое слово в строке (извлечение первого слова из строки в python)
- Python последнее слово в строке (извлечение последнего слова из строки в python)
- индекс элемента строки python (получение индекса символа или подстроки в строке python)

Расширенные примеры использования

Поиск всех вхождений подстроки с помощью find()

Циклический вызов find() со сдвигом начальной позиции позволяет найти все индексы вхождения.

Пример
text = 'ababab'
sub = 'ab'
pos = text.find(sub)
positions = []
while pos != -1:
    positions.append(pos)
    pos = text.find(sub, pos + 1)
print(positions)  # [0, 2, 4]
[0, 2, 4]

Поиск в срезе строки

Параметры start и end позволяют искать только в определённой части строки. Это удобно, например, для парсинга первых N символов.

Пример
s = '0123456789'
print(s.find('5', 3, 7))   # ищем '5' с 3 по 7 индекс (не включая 7) -> 5
print(s.find('5', 0, 3))   # в срезе '012' нет '5' -> -1
5
-1

Поиск с обработкой ошибок при использовании index()

Методы index() и rindex() генерируют ValueError, что можно использовать для явного контроля потока.

Пример
def safe_index(text, sub):
    try:
        return text.index(sub)
    except ValueError:
        return -1

print(safe_index('hello', 'll'))   # 2
print(safe_index('hello', 'xyz'))  # -1
2
-1

Поиск с помощью регулярных выражений (re)

Модуль re предоставляет гибкие возможности. Например, найти все слова, начинающиеся с определённой буквы.

Пример
import re
text = 'Анна, Артем, Иван, Алиса'
pattern = r'\bА\w*'
matches = re.findall(pattern, text)
print(matches)  # ['Анна', 'Артем', 'Алиса']
['Анна', 'Артем', 'Алиса']

Игнорирование регистра при поиске

Приведение к нижнему регистру – простой способ сделать поиск нечувствительным к регистру.

Пример
original = 'Python is FUN'
query = 'fun'
pos = original.lower().find(query.lower())
if pos != -1:
    print(f'Подстрока найдена на позиции {pos}')
else:
    print('Не найдено')
Подстрока найдена на позиции 10

Комбинированный пример: извлечение домена из URL

Использование rfind() для разделения URL на части.

Пример
url = 'https://docs.python.org/3/library/stdtypes.html'
# находим индекс начала домена (после '//')
start = url.find('//') + 2
# находим индекс первого '/' после домена
end = url.find('/', start)
domain = url[start:end] if end != -1 else url[start:]
print(domain)  # docs.python.org
docs.python.org

Проверка окончания строки (без rfind)

Метод endswith() более прямолинеен, но через rfind тоже можно.

Пример
filename = 'image.png'
if filename.rfind('.png') == len(filename) - 4:
    print('Это PNG-файл')
Это PNG-файл

Поиск подстроки в строке с помощью find в Python - comments

En
Python string find (python)