Проверяем наличие подстроки в строке
В этой статье мы расскажем о четырех способах найти подстроку в строке. У каждого способа есть плюсы и минусы — о них мы также кратко поговорим.
1) Оператор in
Простейший способ проверить наличие подстроки в строке — оператор in . Он используется для проверки наличия элемента в какой-либо структуре данных. Этот оператор возвращает булево значение — True или False . Пример:
fullstring = "pythonist" substring = "python" if substring in fullstring: print "Подстрока найдена!" else: print "Подстрока не найдена!"
Этот оператор — сокращенный вызов метода __contains__ . Он подходит и для проверки наличия элемента в списке.
2) Метод String.index()
Тип string имеет метод index . Он возвращает наименьший индекс, по которому обнаруживается начало подстроки в строке. Если подстрока не найдена, то возбуждается исключение ValueError . Реализовать его можно с помощью блока try-except-else.
fullstring = "pythonist" substring = "python" try: fullstring.index(substring) except ValueError: print "Подстрока не найдена!" else: print "Подстрока найдена!"
Этот метод может особенно пригодиться, если вам нужно найти индекс подстроки, а не просто узнать о ее существовании.
3) Метод String.find()
Тип string имеет еще один метод — find . Он удобнее, чем index , потому что благодаря ему нам не нужно думать об обработке ошибок. Если метод не находит подстроку в строке, он возвращает -1 . В случае успеха он возвращает наименьший индекс, по которому обнаруживается подстрока.
fullstring = "pythonist" substring = "python" if fullstring.find(substring) != -1: print "Подстрока найдена!" else: print "Подстрока не найдена!"
Если вы не хотите обрабатывать ошибки — отдайте предпочтение этому методу, а не index .
4) Регулярные выражения (REGEX)
Регулярные выражения — более гибкий способ нахождения подстрок в строках. В Python есть встроенный модуль, позволяющий работать с регулярными выражениями, — re . Модуль re содержит функцию search , которая позволит вам найти подстроку:
from re import search fullstring = "pythonist" substring = "python" if search(substring, fullstring): print "Подстрока найдена!" else: print "Подстрока не найдена!"
Если вам нужны сложные сопоставления, например, учет регистра — этот метод подойдет вам лучше всего. Но у него есть и недостатки: сложность и скорость работы. То есть, в простеньких задачах его лучше не использовать.
Python: поиск в строке
В сегодняшнем посте разбираем поиск подстроки в строке. Задачи стоят элементарнейшие. В отличие от задача по преобразованию строки в число, задачи по поиску решаются в python с помощью встроенных функций. Для решения наших задач определим строки:
# исходная строка string = "Some string for example." # подстрока, которая явно входит в исходную строку substring = "string" # подстрока, которая явно не ходит в исходную строку other_substring = "other string"
Задача №1 — узнать, входит ли подстрока в строку. Операция substring in string вернет нам в результате логический ответ: True в случае, если substring входит в строку, и False в случае, если не входит. Для наглядности приведу ниже пример.
# Для начала хотим узнать, входит ли подстрока в строку if substring in string: print ("Подстрока "%s" входит в строку "%s"" % (substring, string)) else: print ("Подстрока "%s" не входит в строку "%s"" % (substring, string)) # Та же самая процедура с другой подстрокой if other_substring in string: print ("Подстрока "%s" входит в строку "%s"" % (other_substring, string)) else: print ("Подстрока "%s" не входит в строку "%s"" % (other_substring, string))
Задача №2 — узнать позицию вхождения подстроки в строку. Данную задачу решаем с помощью функции find(self, sub[, start[, end]]). Сразу перейдем к примерам:
# Узнаем, с какой позиции подстрока входит в строку print(string.find(substring)) # 5 # Ищем, начиная с позиции 20 print(string.find(substring, 20)) # 44 # Ищем в диапазоне позиций 20 - 30 print(string.find(substring, 20, 30)) # -1 # И смотрим на результат, если подстрока не входит в строку print(string.find(other_substring)) # -1
Далее стоит перед нами задача №3 — вычислить количество вхождений подстроки в строку. С ней легко справляется функция count(self, sub[, start[, end]])
# Нам интересно количество вхождений подстроки в строку print(string.count(substring)) # 2
Задача №4 — проверить входит ли подстрока в строку без учета регистра. Для этого мы воспользуемся функцией преобразования символов строки в нижний/верхний регистр и применим к примеру №1.
# Для начала хотим узнать, входит ли подстрока в строку if substring.lower() in string.lower(): print ("Подстрока "%s" входит в строку "%s"" % (substring, string)) else: print ("Подстрока "%s" не входит в строку "%s"" % (substring, string)) # Та же самая процедура с другой подстрокой if other_substring.upper() in string.upper(): print ("Подстрока "%s" входит в строку "%s"" % (other_substring, string)) else: print ("Подстрока "%s" не входит в строку "%s"" % (other_substring, string))
На этом я остановлюсь, пожалуй. Если возникли вопросы, пожелания или предложения, то оставляйте комментарии. Отвечу всем.
Проверка наличия подстроки в элементах списка строк в Python
Одной из типичных задач в программировании на Python является проверка, содержит ли какой-либо элемент списка определенную подстроку. Допустим, есть список строк:
my_list = ['hello world', 'python is cool', 'welcome to python', 'hello again']
И необходимо проверить, содержат ли элементы списка подстроку ‘hello’. Некоторые могут попытаться выполнить эту задачу следующим образом:
if 'hello' in my_list:
Однако, этот код проверяет, есть ли точное совпадение со строкой ‘hello’ в списке, и вернет False , так как нет ни одного элемента, который бы был точно равен ‘hello’.
Чтобы проверить, содержат ли элементы списка подстроку, нужно выполнить проверку для каждого элемента списка. Это можно сделать с помощью цикла for .
for item in my_list: if 'hello' in item: print(f'"" contains "hello"')
Этот код будет проверять каждый элемент списка my_list на наличие подстроки ‘hello’. Если подстрока найдена, то на экран выводится сообщение, что данная строка содержит ‘hello’.
Таким образом, для того чтобы проверить наличие подстроки в элементах списка строк, необходимо выполнить проверку для каждого элемента списка.
Поиск подстроки в строке
Нужно найти в строке: входит ли данная строчка в строку или нет. например, есть строка sdfssf sddff svvsef xbsdf sdfwwe нужно узнать входит ли в нее dff или нет.
Отслеживать
6,389 4 4 золотых знака 35 35 серебряных знаков 57 57 бронзовых знаков
задан 12 июл 2013 в 7:30
151 3 3 золотых знака 3 3 серебряных знака 11 11 бронзовых знаков
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
if "dff" in "sdfssf sddff svvsef xbsdf sdfwwe": print u"Входит!"
Отслеживать
ответ дан 12 июл 2013 в 7:31
4,666 16 16 серебряных знаков 15 15 бронзовых знаков
опередил на 4 секунды=)
12 июл 2013 в 7:32
а если нужно узнать с какой позиции входит?
12 июл 2013 в 7:35
в комментариях нельзя оформлять красиво код? try: index = s1.index(«dff») except ValueError: print «substring not found»
12 июл 2013 в 7:41
использовать метод find . s1 = «sdfssf sddff svvsef xbsdf sdfwwe» index = s1.find(‘dff’) Этот код делает ровно то же самое, что и в ответе ниже, но выглядит опрятнее, т.к. оно без вложенности.
12 июл 2013 в 8:12
полностью согласен.
12 июл 2013 в 8:14
S1 = 'sdfssf sddff svvsef xbsdf sdfwwe' S2 = 'dff' Count = S1.count(S2) if Count == 0: print('Не входит') else: print('Входит')
Если что — S.count(str) — это функция, которая считает количество вхождений str в S
Отслеживать
ответ дан 8 июл 2018 в 14:00
Влад Волостнов Влад Волостнов
41 2 2 бронзовых знака
то что надо))))
15 июн 2022 в 18:13
Можно с помощью множеств, например при чтении с файла пропускать строки, в которые входит определенное слово:
ignore = ['str1', 'str2', 'str3', 'str4'] with open(file,"r") as f: for line in f.readlines(): if not (set(ignore) & set(line.split())): print(line, end="")
Отслеживать
ответ дан 12 фев 2018 в 21:58
Александр В Александр В
9 1 1 бронзовый знак
ваш код пытается напечатать строки из файла, которые не содержат слова, разделённые пробелом, из заданного списка ignore ( grep -vwFf ignore file ). Этот код не ищет подстроку в строке. Связанный вопрос о том как задачу в ответе эффективно реализовать
13 фев 2018 в 6:42
line_1 — слово которое ищешь. line_2 — где ищешь. 100 — это вероятное совпадения.
def find_word_per(line_1, line_2, percent=100): max_found = 0 for item_1 in range(len(line_1)): for item_2 in range(len(line_2)): index_found = 0 if line_1[item_1] == line_2[item_2]: for index in range(len(line_2) - item_2): if item_1 + index >= len(line_1): break elif line_1[item_1 + index] == line_2[item_2 + index]: index_found += 1 if max_found < index_found: max_found = index_found result_per = (100 / len(line_1)) * max_found return result_per >= percent
Может кому поможет, мою проблему решил.
Отслеживать
ответ дан 13 янв 2022 в 13:39
Andrew Terleckiy Andrew Terleckiy
35 4 4 бронзовых знака
Это ответ на какой-то другой вопрос
13 янв 2022 в 13:44
Добавил сюда так-как меня поисковики часто сюда бросали.
13 янв 2022 в 13:48
Лучше не добавлять ответ не подходящий под вопрос, а добавить отдельный вопрос с подробным описанием проблемы (сейчас не очень очевидно, что такое совпадение с вероятностью) и своим ответом. И возможно вам еще добавят другие варианты ответов.
13 янв 2022 в 13:51
почему не подходящий? test_find(«dff», «sdfssf sddff svvsef xbsdf sdfwwe», 100) # True
13 янв 2022 в 13:55
Потому что в вопросе нужно просто определить, есть ли подстрока в строке. Это решается одним выражением (через in). У вас какая-то другая проблема. Предположим, у кого-то будет похожая проблема, но он на свой вопрос не найдет ответ, потому что ваш ответ не под вопросом с подробным описанием именно вашей проблемы (который будет проиндексирован поисковиками), а где-то под вопросом с совсем другой проблемой.
13 янв 2022 в 13:58
Highly active question. Earn 10 reputation (not counting the association bonus) in order to answer this question. The reputation requirement helps protect this question from spam and non-answer activity.
- python
- строки