Как найти подстроку в строке на Python: все варианты
Основные способы поиска подстроки
Как проверить, содержит ли строка определённую подстроку?
Самый эффективный и читаемый способ - оператор in. Он возвращает True, если подстрока присутствует, иначе False. Внутри Python использует быстрый алгоритм поиска, поэтому для простой проверки существования этот вариант предпочтительнее.
text = 'Привет, мир!'
sub = 'мир'
result = sub in text
print(result) # Trueзаменить текст python (замена подстроки в строке в python)
Оператор in не требует дополнительных методов и прекрасно читается. Он подходит для условий, фильтрации и любых сценариев, где нужно узнать факт наличия подстроки.
Типичная ошибка - чувствительность к регистру. Строка 'Мир' не будет найдена в 'Привет, мир!'. Решение - привести обе строки к одному регистру с помощью lower() или upper():
text = 'Привет, мир!'
sub = 'МИР'
print(sub.lower() in text.lower()) # TruePython заменить число (замена числа в python (например, в строке))
Как получить индекс первого вхождения подстроки?
Метод str.find() возвращает индекс первого символа найденной подстроки или -1, если подстрока отсутствует. Это безопасный способ, не вызывающий исключений при отсутствии.
text = 'Python - отличный язык. Python популярен.'
pos = text.find('Python')
print(pos) # 0
pos2 = text.find('Java')
print(pos2) # -1Python часть текста (извлечение подстроки из строки в python)
Для поиска с заданной позиции передаётся второй аргумент start (и третий end). Это позволяет искать последующие вхождения.
Ошибка: не все разработчики проверяют возврат -1. Если сразу использовать найденный индекс как границу среза, результат может быть некорректным. Всегда следует сравнивать результат с -1 перед использованием.
Как найти индекс, но с генерацией исключения при отсутствии?
Метод str.index() работает как find(), но если подстрока не найдена, выбрасывает исключение ValueError. Это удобно, когда отсутствие подстроки считается ошибкой и должно прервать выполнение.
try:
pos = 'Привет'.index('мир')
except ValueError:
print('Подстрока не найдена')Print split python (использование split с print в python)
Распространённая проблема - забытая обработка исключения. Если не обернуть вызов в try-except, программа упадёт. Используйте index() только тогда, когда уверены в наличии подстроки или если исключение является частью логики.
Как подсчитать количество вхождений подстроки?
Метод str.count() возвращает число неперекрывающихся вхождений подстроки. Он полезен для статистики, анализа текста или проверки повторений.
text = 'abracadabra'
print(text.count('abra')) # 2код пробела python (код символа пробела в python)
Метод также принимает start и end для ограничения диапазона поиска.
Подводный камень: count() не учитывает перекрывающиеся вхождения. Например, для строки 'aaaa' и подстроки 'aa' результат будет 2, а не 3. Для перекрывающихся совпадений потребуется цикл или регулярные выражения.
Как проверить, начинается или заканчивается строка на подстроку?
Методы str.startswith() и str.endswith() возвращают True или False. Они часто применяются для проверки префиксов или суффиксов, например, при работе с путями файлов, URL или расширениями.
filename = 'report.pdf'
print(filename.endswith('.pdf')) # True
print(filename.startswith('report')) # TruePython количество пробелов (количество пробелов в строке python)
Можно передать кортеж возможных вариантов: filename.endswith(('.pdf', '.docx')).
Ошибка: забывают про регистр. Если нужно сравнение без учёта регистра, предварительно преобразуйте строку .lower().
Как выполнить поиск по шаблону с помощью регулярных выражений?
Модуль re предоставляет более гибкие возможности. Функция re.search() ищет совпадение с шаблоном и возвращает объект Match или None. Это единственный способ найти подстроку по сложному шаблону, например, все числа в тексте.
import re
text = 'Цена: 1500 руб, скидка 10%'
match = re.search(r'\d+', text)
if match:
print(match.group()) # 1500
Для поиска всех совпадений используется re.findall().
Распространённые трудности: отсутствие импорта модуля; неправильное экранирование в шаблоне (используйте сырые строки r'...'); производительность при многократном вызове - лучше скомпилировать регулярное выражение с re.compile().
Расширенные примеры поиска подстроки
1. Поиск всех вхождений подстроки с помощью цикла и find()
Если нужно найти индексы всех неперекрывающихся вхождений, можно использовать find() в цикле, сдвигая начальную позицию.
def find_all(text, sub):
positions = []
start = 0
while True:
pos = text.find(sub, start)
if pos == -1:
break
positions.append(pos)
start = pos + len(sub)
return positions
text = 'Москва - столица России. Москва основана в 1147 году.'
sub = 'Москва'
print(find_all(text, sub)) # [0, 19]
Результат: [0, 19]
2. Регистронезависимый поиск с помощью str.lower()
В задачах, где регистр не важен, удобно временно привести обе строки к нижнему регистру.
text = 'PyThon - это Язык Программирования'
sub = 'python'
# Поиск без учёта регистра
if sub.lower() in text.lower():
print('Найдено')
# Получение индекса (find не чувствителен к регистру, поэтому нужна общая нормализация)
pos = text.lower().find(sub.lower())
print(pos) # 0
Результат: Найдено, 0
3. Извлечение всех совпадений с помощью re.findall()
Регулярные выражения позволяют найти все фрагменты, соответствующие шаблону, например, все слова из трёх букв.
import re
text = 'Кот, пёс, сом, рак, лев, конь'
pattern = r'\b[а-яё]{3}\b' # русские трёхбуквенные слова
matches = re.findall(pattern, text, re.IGNORECASE)
print(matches) # ['Кот', 'пёс', 'сом', 'рак', 'лев']
Результат: ['Кот', 'пёс', 'сом', 'рак', 'лев']
4. Поиск перекрывающихся вхождений (например, 'aaa' в 'aaaa')
Стандартный str.find() или str.count() не захватывают перекрытия. Для их поиска можно использовать регулярное выражение с lookahead.
import re
text = 'aaaa'
sub = 'aa'
# Используем позитивный просмотр вперёд, чтобы не поглощать символы
matches = re.finditer(rf'(?=({re.escape(sub)}))', text)
positions = [m.start() for m in matches]
print(positions) # [0, 1, 2]
print(len(positions)) # 3
Результат: [0, 1, 2]
5. Разделение строки по первому вхождению с partition()
Метод str.partition() разделяет строку на три части: до первого вхождения подстроки, сама подстрока и остаток. Это удобно, когда нужно разобрать строку на части по первому разделителю.
url = 'https://example.com/page?id=42'
parts = url.partition('://')
print(parts) # ('https', '://', 'example.com/page?id=42')
# Если разделитель не найден, возвращается (исходная строка, '', '')
text2 = 'Простой текст'
print(text2.partition(':')) # ('Простой текст', '', '')
Результат: ('https', '://', 'example.com/page?id=42'), ('Простой текст', '', '')