Python поиск подстроки в строке: python — Поиск подстроки в строке

Содержание

Проверка вхождения одной строки в другую в Python

Как проверить, содержит ли строка Python другую строку?

Проверка, содержит ли строка какую-нибудь другую строку, это одна из самых распространенных операций, осуществляемых разработчиками.

Если вы раньше (до перехода на Python) писали код, скажем, на Java, для подобной проверки вы могли использовать метод contains.

В Python есть два способа достичь той же цели.

1. Использование оператора in

Самый простой способ проверить, содержится ли в строке другая строка, это использовать оператор Python in.

Давайте рассмотрим пример.

>>> str = "Messi is the best soccer player"
>>> "soccer" in str
True
>>> "football" in str
False

Как видите, оператор in возвращает True, если указанная подстрока является частью строки.

В противном случае он возвращает False.

Этот метод очень простой, понятный, читаемый и идиоматичный.

2. Использование метода find

Также для проверки вхождения одной строки в другую можно использовать строковый метод find.

В отличие от оператора, возвращающего булево значение, метод find возвращает целое число.

Это число является по сути индексом начала подстроки, если она есть в указанной строке. Если этой подстроки в строке не содержится, метод возвращает -1.

Давайте посмотрим, как работает метод find.

>>> str = "Messi is the best soccer player"
>>> str.find("soccer")
18
>>> str.find("Ronaldo")
-1
>>> str.find("Messi")
0

Что особенно хорошо в применении этого метода — вы можете при желании ограничить пределы поиска, указав начальный и конечный индекс.

Например:

>>> str = "Messi is the best soccer player"
>>> str.find("soccer", 5, 25)
18
>>> str.find("Messi", 5, 25)
-1

Обратите внимание, что для подстроки «Messi» метод вернул -1. Это произошло потому, что мы ограничили поиск в строке промежутком символов с индексами от 5-го до 25-го.

Более сложные способы

Представьте на минутку, что в Python нет никаких встроенных функций или методов, позволяющих проверить, входит ли одна строка в другую. Как бы вы написали функцию для этой цели?

Можно использовать брутфорс-подход и на каждой возможной позиции в строке проверять, начинается ли там искомая подстрока. Но для длинных строк этот процесс будет очень медленным.

Есть лучшие алгоритмы поиска строк. Если вы хотите углубиться в эту тему, можем порекомендовать статью «Rabin-Karp and Knuth-Morris-Pratt Algorithms». Также вам может пригодиться статья «Поиск подстроки» в Википедии.

Если вы прочитаете указанные статьи, у вас может родиться закономерный вопрос: так какой же алгоритм используется в Python?

Для поиска ответов на подобные вопросы практически всегда нужно углубиться в исходный код. В этом плане вам повезло: Python это технология с открытым кодом. Давайте же в него заглянем.

Как удачно, что разработчики прокомментировали свой код! Теперь нам совершенно ясно, что метод find использует смесь алгоритмов Бойера-Мура и Бойера-Мура-Хорспула.

Заключение

Для проверки, содержится ли указанная строка в другой строке, в Python можно использовать оператор in или метод find.

Оператор in возвращает True, если указанная подстрока является частью другой строки. В противном случае он возвращает False.

Метод find возвращает индекс начала подстроки в строке, если эта подстрока там есть, или -1 — если подстрока не найдена.

CPython использует для поиска строк комбинацию алгоритмов Бойера-Мура и Бойера-Мура-Хорспула.

Python. Функции, основанные на поиске и замене подстроки в строке


Содержание

  • 1. Функция str.count(). Количество вхождений подстроки в заданном диапазоне
  • 2. Функция str.find(). Поиск подстроки в строке
  • 3. Функция str.index(). Поиск подстроки в строке с генерированием исключения
  • 4. Функция str.rfind(). Найти наибольший индекс вхождения подстроки в строку
  • 5. Функция str.rindex(). Найти наибольший индекс вхождения подстроки в строку с генерированием исключения ValueError
  • 6. Функция str.replace(). Замена подстроки в строке
  • Связанные темы

Поиск на других ресурсах:

1. Функция str.count(). Количество вхождений подстроки в заданном диапазоне

Функция str.count() возвращает количество вхождений подстроки в заданном диапазоне. Согласно документации Python общая форма использования функции следующая

n = str. count(substring[, start[, end]])

где

  • n – результат, количество вхождений подстроки substring в строке str, которые не перекрываются;
  • str – исходная строка;
  • substring – подстрока, которая может входить в строку str;
  • start, end – соответственно начальная и конечная позиции (индексы) в строке
    str
    , определяющие диапазон который принимается ко вниманию (рассматривается). Иными словами значения start, end определяют срез.

Пример.

# Функция str.count() - количество вхождений подстроки в заданном диапазоне

# 1. Вызов функции с указанием диапазона
s1 = 'abcdef' # исходная строка
n = s1.count('bcd', 0, len(s1)) # n = 1, диапазон 0..5

n = 'ab ab babab'.count('ab', 2, 10) # n = 2
n = 'ab ab babab'.count('ab', 0, 6) # n = 2

# 2. Вызов функции без указания диапазона
s1 = 'Hello world!'
n = s1. count('о') # n = 2, количество символов 'о' в строке

s1 = 'abcbcd abcd'
n = s1.count("bc") # n = 3

# 3. Вызов функции с указанием начального значения start
s1 = 'abc abc abcd'
n = s1.count('abc', 3) # n = 2

  ⇑

2. Функция str.find(). Поиск подстроки в строке

Функция find() предназначена для поиска подстроки в строке. В соответствии с документацией Python общая форма вызова функции следующая:

index = s.find(sub [, start[, end]])

где

  • index – целочисленное значение, которое есть индексом первого вхождения подстроки sub в строке s. Если подстрока sub не найдена в строке s, то index=-1;
  • s – строка, в которой осуществляется поиск подстроки sub;
  • start, end – позиции в строке s. Эти позиции определяют границы среза s[start:end], определяющего обрабатываемый диапазон. Если не задавать параметры start, end, то поиск осуществляется во всей строке.

Пример.

# Функция str.find() - поиск подстроки в строке

# Исходная строка, в которой осуществляется поиск
s = 'abcde fg hijkl mnop'

# 1. Обработка целой строки
index = s.find('hij') # index = 9
index = s.find('+-=') # index = -1

# 2. Обработка среза s[start:end]
# берется ко вниманию часть 'abcde' строки s
index = s.find('hij', 0, 5) # index = -1
index = s.find('cde', 0, 5) # index = 2

index = 'hello world!'.find('wor', 2, len(s)) # index = 6


  ⇑

3. Функция str.index(). Поиск подстроки в строке с генерированием исключения

Функция str.index() осуществляет поиск подстроки в строке. Данная функция работает так же как и функция str.find(), однако, если подстрока не найдена, то вызывается исключение ValueError.

Согласно документации Python общая форма вызова функции следующая:

pos = str. index(substring [, start [, end]])

где

  • pos – позиция подстроки substring в строке str в случае, если строка найдена. Если подстрока не найдена, то вызывается исключение ValueError;
  • str – строка, в которой осуществляется поиск;
  • start, end – соответственно начальная и конечная позиции в строке str, определяющие диапазон поиска.

Пример.

# Функция str.index() - поиск подстроки в строке

# Случай 1. Генерируется исключение ValueError: substring not found
#t = str.index('sdf', 'abcdef def hj') - исключительная ситуация

# Случай 2. Подстрока существует в строке
s = 'abcdef'
t = s.index('bc') # t = 1 - позиция найденной подстроки

# Поиск в заданном диапазоне
s = 'abc def ghi def'
t = s.index('def', 0, len(s)) # t = 4

# Поиск в диапазоне '012'
s = '0123456789'
t = s.index('012', 0, 3) # t = 0

  ⇑

4.
Функция str.rfind(). Найти наибольший индекс вхождения подстроки в строку

Функция str.rfind() возвращает наибольшую позицию (индекс) в строке заданной подстроки, если таковая найдена. Общая форма использования функции следующая:

position = str.rfind(subs[, start[, end]])

где

  • position – искомая позиция (индекс) вхождения подстроки subs в строке str. Если подстрока subs в строке str не найдена, то position=-1;
  • str – строка, в которой осуществляется поиск подстроки subs;
  • subs – заданная подстрока;
  • start, end – соответственно начальный и конечный индексы, определяющие срез в строке str.

Пример.

# Функция str.rfind()

# 1. Использование без указания диапазона
s1 = 'abc def ab abc'
index = s1.rfind('ab') # index = 11
index = s1.rfind('jkl') # index = -1

# 2.
Использование с указанием начала start s1 = '012 345 012' index = s1.rfind('01', 3) # index = 8 # 3. Использование с указанием начала start и конца end s1 = 'abc def abc def gh' s2 = 'bc' # подстрока index = s1.rfind(s2, 0, len(s1)) # index = 9 index = s1.rfind(s2, 0, 1) # index = -1, подстрока не найдена

  ⇑

5. Функция str.rindex(). Найти наибольший индекс вхождения подстроки в строку с генерированием исключения ValueError

Функция str.rindex() работает также как и функция rfind(), то есть возвращает наибольшую позицию подстроки в строке. Разница между rindex() и rfind() состоит в следующем: если подстрока не найдена в строке, то генерируется исключение ValueError.

Общая форма использования функции следующая:

position = str.rindex(subs[, start[, end]])

где

  • position – искомая позиция (индекс) вхождения подстроки subs в строке str. Если подстрока subs в строке str не найдена, генерируется исключение ValueError;
  • str – строка, в которой осуществляется поиск подстроки subs;
  • subs – заданная подстрока;
  • start, end – соответственно начальный и конечный индексы, определяющие срез в строке str.

Пример.

# Функция str.index()

# 1. Использование без указания диапазона
s1 = 'abc def ab abc'
index = s1.rindex('ab') # index = 11
index = str.rindex(s1, ' ') # index = 10, символ пробел на 10-й позиции

# 2. Использование с указанием начала start
s1 = '012 345 012'
index = s1.rindex('01', 3) # index = 8

# 3. Использование с указанием начала start и конца end
s1 = 'abc def abc def gh'
s2 = 'bc' # подстрока
index = s1.rindex(s2, 0, len(s1)) # index = 9

# Следующий код сгенерирует исключение
# ValueError: substring not found
index = s1.rindex(s2, 0, 1)

  ⇑

6. Функция str.replace(). Замена подстроки в строке

Функция str.replace() возвращает копию строки, в который все вхождения подстроки old заменены на new.

Общая форма использования функции

s1 = s2.replace(old, new[, count])

где

  • s1 – результирующая строка-копия;
  • s2 – строка-оригинал, в которой делаются замены подстроки old на подстроку new;
  • old – подстрока, которая может быть заменена другой подстрокой new. Количество символов в подстроке произвольно. Если подстрока old не найдена в строке s2, тогда функция возвращает строку s2 без изменений;
  • new – подстрока, заменяющая подстроку old в строке s2;
  • count – количество замен которые могут быть осуществлены. Если count не задано, то замены осуществляются во всех возможных вхождениях подстроки old в строке s2.

Пример.

# Функция str.replace() - замена подстроки в строке

# 1. Вызов без использования параметра count
s1 = 'abcdef'
s2 = s1.replace('bc', '111') # s2 = 'a111def'

s1 = 'abc abc abc'
s2 = s1.replace('bc', '0000') # s2 = 'a0000 a0000 a0000'

# Случай, если подстрока в строке не найдена
s2 = str.replace(s1, 'jkl', '111') # s2 = 'abcdef'

# 2. Вызов с использованием параметра count
s1 = 'abcd abcd abcd'
s2 = s1.replace('bcd', '+++', 3) # s2 = 'a+++ a+++ a+++'
s2 = s1. replace('bcd', '++++', 2) # s2 = 'a++++ a++++ abcd'
s2 = s1.replace('ab', '---', 1) # s2 = '---cd abcd abcd'
s2 = s1.replace('abcd', '==', 6) # s2 = '== == =='

  ⇑


Связанные темы

  • Функции для работы со строками, определяющие особенности строки
  • Функции обрабатывающие и определяющие начало и конец строки
  • Функции обработки строки в соответствии с форматом или правилом кодирования. Стили форматирования

  ⇑


 

Питон | Проверка наличия подстроки в заданной строке

В этой статье мы расскажем, как проверить, содержит ли строка Python другую строку или подстроку в Python. Учитывая две строки, проверьте, есть ли подстрока в данной строке или нет.

 Пример 1: Ввод: Подстрока = "выродки"
           String="гики для гиков"
Выход: да
Пример 2: Ввод: Подстрока = "выродок"
           String="гики для гиков"
Вывод: да 

Есть ли в Python строка, содержащая метод подстроки

Да, проверка подстроки — одна из наиболее часто используемых задач в Python. Python использует множество методов для проверки строки, содержащей подстроку, например, find(), index(), count() и т. д. Наиболее эффективным и быстрым методом является использование оператора « в «, который используется в качестве оператора сравнения. . Здесь мы рассмотрим различные подходы, такие как:

  • Использование if… in 
  • Проверка с использованием метода split()
  • Использование метода find()
  • Использование метода count()
  • Использование метода index()
  • Использование магического класса __contains__.
  • Using regular expressions 

Method 1: Check substring using the if… in.

Python3

MyString1 = "A geek in need is a geek indeed"

если "нужно" в MyString1:

     печать ( "Да! Он присутствует в строке" )

ELSE :

ПРИНАНИЯ ( ( " ( "!

Выход

 Да! она присутствует в строке 

Способ 2: Проверка подстроки с помощью метода split()

Проверка наличия или отсутствия подстроки в заданной строке без использования какой-либо встроенной функции. Сначала разбейте данную строку на слова и сохраните их в переменной s, затем, используя условие if, проверьте, присутствует ли подстрока в данной строке или нет.

Python3

 

string = "geeks for geeks"  

substring = "geeks"  

 

s = string. Split ()

IF Substring в S:

Печать ( "Да” 0 ( "Да" 0 ( "Да" 0 ( "да")

else :

     print ( "no" )

Output

 yes 

Method 3: Check substring using the Метод find()

Мы можем итеративно проверять каждое слово, но Python предоставляет нам встроенную функцию find(), которая проверяет наличие подстроки в строке, что делается в одной строке. Функция find() возвращает -1, если она не найдена, иначе она возвращает первое вхождение, поэтому с помощью этой функции эта проблема может быть решена.

Python3

DEF Проверка. 1 ):

         print ( "NO" )

     else :

         Печать ( "Да" )

Строка = "Веды для родов. check(string, sub_str)

Вывод

 YES 

Метод 4. Проверка подстроки с помощью метода count()

7 900 строку, то вы можете использовать метод count() Python. Если подстрока не найдена, то будет напечатано «да», иначе будет напечатано «нет».

Python3

DEF Проверка (S2, S1):

IF (S2.Count (S1)> 3

.4040404039.. . . . . . . . . . . . . . . . . . . . . . . .    (S2.Count (S1)>  . print    (    "YES"    )   

     else :

         print ( "NO" )

 

 

s2 = "A geek in need is a geek indeed"

s1 = "geeks"

check(s2, s1)

Вывод

 НЕТ 

Метод 5: Проверка подстроки с помощью метода index()

Метод . index() возвращает начальный индекс подстроки, переданной в качестве параметра. Здесь « подстрока ” is present at index 16.

Python3

any_string = "Geeks for Geeks substring "

start = 0

end = 1000

Печать (any_string.index ( 'Подстроение' , начало, конец))

Выход:

16

.0005

Способ 6. Проверка подстроки с помощью магического класса «__contains__».

Строка Python __contains__(). Этот метод используется для проверки наличия строки в другой строке или нет.

Python3

a = [ 'Geeks-13' , 'for-56' , 'Geeks-78' , ' xyz-46' ]

на i in a:

     if i.__contains__( "Geeks" ):

         print (f "Yes! {i } содержит." )

Вывод

 Да! Компьютерщики-13 содержат.
Да! Выродки-78 содержат. 

Способ 7. Проверка подстроки с помощью регулярных выражений

RegEx можно использовать для проверки наличия в строке указанного шаблона поиска. В Python есть встроенный пакет re , который можно использовать для работы с регулярными выражениями.

Python3

import re

 

MyString1 = "A geek in need is a geek indeed"

MyString2 = "geeks"

 

IF RE.Search (MyString2, MyString1):

Печать ( "Да, строка '{0}' присутствует в строке '{1}' 40404040404040404040404. Формат (

MyString2, MyString1))

ELSE :

3

(9004. 9004. 9004. 9004. 40404040404. 4. 'not String 9004. 9004. 9004. 9004. 9004. 9004. 9004. 4. '{1}' " . Формат (

MyString2, MyString1))

Выход

 NO, String 'Geeks' Not In String in String in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in wort in worpt in out in in in out in wout in worpl 

Метод: Использование Постижения списка

Python3

S = "Гики для гисточек"

S2 = 39

S2 = 39 "

S2 = 39"

S2 = "

S2 = 39

S2 = "

S2 =

. 0040

print ([ "yes" if s2 in s else "no" ])

Output

 ['yes'] 

Method: Using lambda function

Python3

s = "geeks for geeks"

s2 = "geeks"

x = Список ( Фильтр ( Lambda x: (S2 In .). ([ "yes" if x else "no" ])

Output

 ['yes'] 

Method: Using countof функция

Python3

import operator as op

s = "geeks for geeks"

s2 = "geeks"

print ([ "yes" if op. countOf(s.split(),s2)> 0 else "no" ])

Output

 ['yes'] 

Как проверить, содержит ли строка Python подстроку — настоящий Python

чтобы проверить, содержит ли строка другую строку в Python.

Идентификация таких подстрок пригодится, когда вы работаете с текстовым содержимым из файла или после того, как вы получили пользовательский ввод. Вы можете выполнять различные действия в своей программе в зависимости от того, присутствует подстрока или нет.

В этом руководстве вы сосредоточитесь на самом Pythonic способе решения этой задачи, используя оператор членства в . Кроме того, вы узнаете, как идентифицировать правильные строковые методы для связанных, но разных вариантов использования.

Наконец, вы также узнаете, как найти подстроки в столбцах pandas . Это полезно, если вам нужно выполнить поиск данных из CSV-файла. Вы могли бы использовать подход, который вы узнаете в следующем разделе, но если вы работаете с табличные данные , лучше всего загрузить данные в pandas DataFrame и искать подстроки в pandas.

Как убедиться, что строка Python содержит другую строку

Если вам нужно проверить, содержит ли строка подстроку, используйте оператор принадлежности Python в . В Python это рекомендуемый способ подтверждения наличия подстроки в строке:

.

>>>

 >>> raw_file_content = """Привет и добро пожаловать.
... Это специальный скрытый файл с СЕКРЕТНЫМ секретом.
... Я не хочу раскрывать тебе Секрет,
... но я хочу по секрету сказать вам, что он у меня есть."""
>>> "секрет" в raw_file_content
Истинный
 

Оператор членства в дает вам быстрый и удобный способ проверить, присутствует ли подстрока в строке. Вы можете заметить, что строка кода читается почти как английский язык.

Примечание: Если вы хотите проверить, является ли подстрока , а не в строке, вы можете использовать не в :

>>>

 >>> "secret" не в raw_file_content
ЛОЖЬ
 

Поскольку подстрока "секретная" присутствует в raw_file_content , оператор не в возвращает False .

При использовании в выражение возвращает логическое значение:

  • Истинно , если Python нашел подстроку
  • Ложь , если Python не нашел подстроку

Вы можете использовать этот интуитивно понятный синтаксис в условных операторах для принятия решений в вашем коде:

>>>

 >>> если "секрет" в raw_file_content:
... печать("Найдено!")
...
Найденный!
 

В этом фрагменте кода вы используете оператор принадлежности, чтобы проверить, является ли "secret" подстрокой raw_file_content . Если это так, то вы напечатаете сообщение на терминал. Любой код с отступом будет выполняться только в том случае, если проверяемая вами строка Python содержит предоставленную вами подстроку.

Примечание: Python всегда рассматривает пустые строки как подстроку любой другой строки, поэтому проверка на наличие пустой строки в строке возвращает True :

>>>

 >>> "" в "секрет"
Истинный
 

Это может показаться удивительным, поскольку Python считает строки emtpy ложными, но это крайний случай, о котором полезно помнить.

Оператор членства в — ваш лучший друг, если вам просто нужно проверить, содержит ли строка Python подстроку.

Однако что, если вы хотите узнать больше о подстроке? Если вы прочитаете текст, хранящийся в raw_file_content , то вы заметите, что подстрока встречается более одного раза и даже в разных вариациях!

Какие из этих вхождений нашел Python? Имеет ли значение заглавная буква? Как часто эта подстрока встречается в тексте? И каково расположение этих подстрок? Если вам нужен ответ на любой из этих вопросов, продолжайте читать.