Программирование

Python строка содержит подстроку: in, find, index

В Python нет string.contains, используйте 'in', str.find() или str.index() для проверки подстроки в строке. Примеры кода, альтернативы с regex и pandas, производительность и ошибки. Замена somestring.contains на питоничный код.

Есть ли в Python метод для проверки наличия подстроки в строке?

Я ищу метод string.contains или string.indexOf в Python.

Я хочу сделать следующее:

python
if not somestring.contains("blah"):
 continue

В Python нет методов string.contains или string.indexOf; для проверки наличия подстроки используют оператор in, метод str.find() (python find — возвращает индекс или -1) или str.index() (выбрасывает ValueError). Самый простой и питоничный способ — if "blah" in somestring: (или if "blah" not in somestring: для вашего примера). Если нужна позиция подстроки — pos = somestring.find("blah") или try: pos = somestring.index("blah") ....


Содержание


python строка содержит — краткий ответ

Коротко: метода string.contains или string.indexOf в стандартной строке Python нет. Это подтверждается в официальной документации по типам строк — вместо этого предусмотрены in (через __contains__), str.find(), str.index() и др. — см. раздел Built-in Types в документации Python: https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str.

Что делать с вашим примером?

Ваш код (НЕ работает):

python
if not somestring.contains("blah"):
 continue

Правильные и распространённые варианты:

python
# самый питоничный вариант
if "blah" not in somestring:
 continue

# если нужна позиция (find возвращает -1, если не найдено)
if somestring.find("blah") == -1:
 continue

# если хотите исключение при отсутствии (index -> ValueError)
try:
 pos = somestring.index("blah")
except ValueError:
 continue

Если вы попытаетесь вызвать somestring.contains("blah"), получите ошибку вида AttributeError: 'str' object has no attribute 'contains'. Этот вопрос часто обсуждали на Stack Overflow: https://stackoverflow.com/questions/3437059/does-python-have-a-string-contains-substring-method.


Оператор in — самый питоничный способ

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

python
if "hello" in "hello world":
 print("Found")

Противоположный вариант — not in:

python
if "blah" not in somestring:
 continue

Особенности:

  • поиск чувствителен к регистру ("a" in "A"False).
  • in работает быстро и написан на C в реализации CPython; для простых проверок это лучший выбор.
  • in использует метод __contains__ у объекта строки (см. документацию выше).

Коротко: для обычной проверки “строка содержит” используйте in. Быстро. Просто.


str.find(), str.index() и python find — когда использовать

Если нужна не булева проверка, а позиция (индекс) подстроки — применяют find() или index():

  • s.find(sub[, start[, end]]) — возвращает индекс первого вхождения или -1, если не найдено.
  • s.index(sub[, start[, end]]) — возвращает индекс первого вхождения или выбрасывает ValueError, если не найдено.
  • s.rfind(sub) — индекс последнего вхождения или -1.
  • s.count(sub) — количество неперекрывающихся вхождений.

Примеры:

python
s = "hello world"
print(s.find("world")) # 6
print(s.find("xyz")) # -1

try:
 i = s.index("xyz")
except ValueError:
 print("Нет вхождения")

Когда что брать:

  • Нужно просто знать есть ли подстрока — in.
  • Нужна позиция и удобнее значение -1find.
  • Нужна позиция и вы хотите исключение при отсутствии — index.
  • Нужны все (или последние) вхождения — find в цикле/finditer у re.

Дополнительные практические примеры и объяснения есть на GeeksforGeeks: https://www.geeksforgeeks.org/python/check-if-string-contains-substring-in-python/ и на StackAbuse: https://stackabuse.com/python-check-if-string-contains-substring/.


Регулярные выражения и pandas: сложные случаи

Иногда нужно не просто проверить подстроку, а учесть шаблон, границы слов или регистр. Тогда пригодятся регулярные выражения:

python
import re

# простая проверка
if re.search(r"blah", somestring):
 ...

# проверка слова целиком, игнорируя регистр
if re.search(r"\bblah\b", somestring, flags=re.IGNORECASE):
 ...

Реиспользуйте скомпилированный объект для многократных проверок:

python
pat = re.compile(r"\b\d{4}\b")
if pat.search(text):
 ...

Если вы работаете с таблицей (pandas), используйте векторизованное Series.str.contains:

python
import pandas as pd
df[df['text'].str.contains('blah', na=False)]

Больше практических примеров по строкам и подстрокам в Python — обзор на Real Python: https://realpython.com/python-string-contains-substring/.


Производительность, частые ошибки и нюансы

Нюансы и советы:

  • Для простых проверок in обычно быстрее и понятнее; find/index дают индекс.
  • Поиск чувствителен к регистру. Для нечувствительного — s.lower() + поиск или re.IGNORECASE. Учтите расходы на приведение регистра при частых операциях.
  • Unicode: при сравнении с диакритикой может понадобиться нормализация (unicodedata.normalize('NFC', s)).
  • Bytes vs str: для байтовых строк используйте байтовые литералы b'pat' in somebytes.
  • None: часто ошибка — ожидание строки, а приходит None. Проверяйте: if somestring and "blah" in somestring:.
  • Перекрывающиеся вхождения: str.count() не считает перекрывающиеся; для них используйте re.finditer с lookahead.
  • Множественные паттерны: если нужно искать сотни шаблонов, рассмотрите алгоритмы типа Aho–Corasick (есть библиотеки), а не наивный any(sub in s for sub in patterns).

Ошибка, которую вы получите при вызове несуществующего метода:

python
>>> "abc".contains("a")
Traceback (most recent call last):
 ...
AttributeError: 'str' object has no attribute 'contains'

Примеры: как заменить ваш код somestring.contains

Переписать ваш фрагмент так:

  1. Простая замена (поведение как в вашем примере):
python
if "blah" not in somestring:
 continue
  1. Через find (если нужна позиция):
python
if somestring.find("blah") == -1:
 continue
# или получить позицию
pos = somestring.find("blah")
  1. Через index (если хотите исключение при отсутствии):
python
try:
 pos = somestring.index("blah")
except ValueError:
 continue
  1. Нечувствительно к регистру:
python
if "blah" not in somestring.lower():
 continue
  1. С регулярным выражением (слово по границам):
python
import re
if not re.search(r"\bblah\b", somestring, flags=re.IGNORECASE):
 continue
  1. Несколько шаблонов:
python
patterns = ("foo", "bar", "baz")
if not any(p in somestring for p in patterns):
 continue
  1. Pandas (векторно):
python
df = df[df['col'].str.contains('blah', na=False)]

В моём опыте if "substr" in s решает 90% задач: читаемо, быстро, понятно коллегам. Но если вы делаете сложные поиски по большим данным — подумайте про подготовку данных, нормализацию и компиляцию шаблонов.


Источники

  1. Does Python have a string ‘contains’ substring method? - Stack Overflow
  2. Built-in Types — Python 3.14.2 documentation
  3. Python: Check if String Contains Substring — StackAbuse
  4. Check if String Contains Substring in Python - GeeksforGeeks
  5. How to Check if a Python String Contains a Substring – Real Python

Заключение

Нет, в Python нет string.contains или string.indexOf; вместо этого используйте оператор in для проверки наличия подстроки (python строка содержит), а при необходимости — str.find() или str.index() для получения позиции. Простая замена вашего кода — if "blah" not in somestring: continue — коротко, понятно и эффективно.

Авторы
Проверено модерацией
Модерация
Python строка содержит подстроку: in, find, index