Поиск подстроки в строке с помощью find в Python
Основное решение: метод find()
Метод str.find(sub[, start[, end]]) возвращает индекс первого вхождения подстроки sub в строку. Если подстрока не найдена, возвращается -1. Это наиболее эффективный способ проверить наличие подстроки без прерывания программы (в отличие от index()).
text = 'Привет, мир! Python - лучший язык.'
position = text.find('мир')
print(position) # 8Python 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.pdfPython 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
Расширенные примеры использования
Поиск всех вхождений подстроки с помощью 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-файл