Проверка наличия подстроки в строке на Python - полный разбор приёмов
Проверка наличия подстроки в строке Python
Наиболее простой и эффективный способ проверки вхождения подстроки в строку в Python - оператор in. Он возвращает True, если подстрока найдена, и False в противном случае. Оператор работает быстро, так как реализован на уровне C и использует оптимизированный алгоритм поиска.
text = "Программирование на Python - увлекательный процесс"
sub = "Python"
print(sub in text) # True
sub2 = "Java"
print(sub2 in text) # False
Python strip (метод strip в python)
Возможные ошибки: оператор in чувствителен к регистру. Если необходимо игнорировать регистр, следует предварительно привести обе строки к одному регистру, например, с помощью метода .lower() или .casefold(). Также оператор работает только для строк; для проверки вхождения в другие последовательности (списки, кортежи) он тоже подходит, но в рамках статьи речь идёт о строках.
Как проверить вхождение подстроки с получением индекса?
Метод str.find() возвращает индекс первого вхождения подстроки или -1, если подстрока не найдена. Это удобно, когда нужна позиция начала подстроки.
text = "Python позволяет писать чистый код"
index = text.find("чистый")
print(index) # 23
index_miss = text.find("грязный")
print(index_miss) # -1
Python повторить строку (повторение строки в python)
Типичная ошибка: начинающие разработчики иногда путают возвращаемое значение -1 со значением 0 (когда подстрока находится в начале строки). Рекомендуется всегда проверять результат: if text.find(sub) != -1.
Как найти подстроку, но получить исключение при её отсутствии?
Метод str.index() работает аналогично find(), но если подстрока не найдена, вызывается исключение ValueError. Это может быть полезно, когда отсутствие подстроки считается ошибкой.
text = "Исключения - это часть языка"
try:
pos = text.index("часть")
print(f"Подстрока найдена на позиции {pos}")
except ValueError:
print("Подстрока не найдена")
Tuple в str python (преобразование кортежа в строку в python)
Если не обработать исключение, программа аварийно завершится. Поэтому метод index() следует использовать только тогда, когда отсутствие подстроки - недопустимая ситуация.
Как подсчитать количество вхождений подстроки?
Метод str.count() возвращает число непересекающихся вхождений подстроки. Если результат равен нулю, подстрока отсутствует.
text = "рекурсия рекурсия рекурсия"
count = text.count("рекурсия")
print(count) # 3
count_none = text.count("итерация")
print(count_none) # 0
Python объект в строку (преобразование объекта в строку в python)
Как проверить вхождение с помощью регулярных выражений?
Модуль re предоставляет функцию re.search(), которая ищет совпадение с шаблоном. Возвращает объект совпадения или None. Позволяет гибко настраивать поиск (регистр, метасимволы).
import re
text = "Цена: 1000 рублей"
pattern = r"\d+"
match = re.search(pattern, text)
if match:
print(f"Найдено число: {match.group()}")
else:
print("Число не найдено")
Python convert string (преобразование строк в python)
Типичная ошибка: забыть экранировать метасимволы (точку, звёздочку) в шаблоне, что приведёт к неожиданным совпадениям. Также регулярные выражения работают медленнее простого in и используются только при необходимости.
Как проверить начало или конец строки на совпадение с подстрокой?
Методы str.startswith() и str.endswith() проверяют, начинается или заканчивается ли строка заданной подстрокой. Это частные случаи проверки вхождения.
url = "https://example.com"
print(url.startswith("https")) # True
print(url.endswith(".com")) # True
Python str to bytes (преобразование строки в байты в python)
Как реализовать собственную проверку с помощью __contains__?
Класс str реализует специальный метод __contains__, который вызывается оператором in. Его можно переопределить в пользовательских классах для кастомного поведения.
class MyString:
def __init__(self, s):
self.s = s
def __contains__(self, item):
return item.lower() in self.s.lower()
text = MyString("Python")
print("python" in text) # True
функция разделить python (разделение строки на список в python)
Как проверить наличие одной из нескольких подстрок?
Функция any() в сочетании с генератором списка позволяет проверить, содержит ли строка хотя бы одну из подстрок.
text = "Мне нравится программировать на Python"
substrings = ["Java", "Python", "C++"]
result = any(sub in text for sub in substrings)
print(result) # True
Расширенные примеры проверки вхождения подстроки
Ниже приведены примеры, которые решают специфические задачи, встречающиеся на практике.
Регистронезависимая проверка с casefold
text = "Python - язык программирования"
search = "питон" # нет точного совпадения
# Используем casefold() для корректной обработки символов Юникода
result = search.casefold() in text.casefold()
print(result) # False, потому что 'питон' не совпадает с 'Python'
# Но если искать 'py', то True
print("py".casefold() in text.casefold()) # True
False True
Проверка наличия любой подстроки из списка с игнорированием регистра
text = "Сегодня солнечная погода, температура +22"
ignore_case = True
keywords = ["солнеч", "дождлив", "облачн"]
if ignore_case:
found = any(kw.lower() in text.lower() for kw in keywords)
else:
found = any(kw in text for kw in keywords)
print(found) # True ("Солнечная" содержит "солнеч")
True
Проверка вхождения с учётом границ слов (использование регулярного выражения)
import re
text = "В книге слово 'cat', но не 'catalog'"
# Найдём 'cat' как целое слово
pattern = r"\bcat\b"
match = re.search(pattern, text)
if match:
print(f"Найдено: {match.group()}") # cat
else:
print("Не найдено")
Найдено: cat
Поиск подстроки в байтовых строках (bytes/bytearray)
data = b"\x48\x65\x6c\x6c\x6f" # 'Hello'
sub = b"ell"
print(sub in data) # True
print(data.find(sub)) # 1
# Для bytearray
ba = bytearray(data)
print(sub in ba) # True
True 1 True
Проверка вхождения в pandas DataFrame (строковые столбцы)
import pandas as pd
df = pd.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"email": ["alice@example.com", "bob@test.org", "charlie@mail.com"]
})
# Проверка, содержит ли email подстроку "example"
df["is_example"] = df["email"].str.contains("example", na=False)
print(df)
name email is_example
0 Alice alice@example.com True
1 Bob bob@test.org False
2 Charlie charlie@mail.com False
Проверка в нескольких строках из списка с частичным совпадением
phrases = ["код на Python", "отладка кода", "рефакторинг"]
search = "код"
results = [search in phrase for phrase in phrases]
print(results) # [True, True, False]
# Отфильтровать строки, содержащие подстроку
filtered = [phrase for phrase in phrases if search in phrase]
print(filtered) # ['код на Python', 'отладка кода']
[True, True, False] ['код на Python', 'отладка кода']
Поиск подстроки с игнорированием пунктуации
import string
text = "Привет, Мир!"
search = "мир"
# Удалим пунктуацию и приведём к нижнему регистру
clean_text = text.translate(str.maketrans('', '', string.punctuation)).lower()
result = search.lower() in clean_text
print(result) # True ("мир" есть в "привет мир")
True
Использование метода str.__contains__() напрямую (для демонстрации)
text = "Магия Python"
contains_method = text.__contains__
print(contains_method("Python")) # True
print(contains_method("Java")) # False
True False
Проверка наличия подстроки с учётом расстояния Левенштейна (нечёткое совпадение)
# Установите библиотеку pip install fuzzywuzzy python-Levenshtein
from fuzzywuzzy import fuzz
text = "пример тестовой строки"
query = "тест"
# Используем частичное отношение (где находится лучшая подстрока)
ratio = fuzz.partial_ratio(query, text)
print(ratio) # 100, если подстрока найдена как часть
# Можно задать порог
if ratio >= 90:
print("Подстрока почти совпадает")
100 Подстрока почти совпадает