[ЗВУК] [ЗВУК] Кроме метода find существует еще один метод поиска подстроки в строке, это метод rfind. Давайте вернем тот текст, что у нас был, и посмотрим, что найдет rfind. «R» это сокращение от «right», то есть «справа», это есть поиск первого вхождения справа налево. То есть давайте, должно найтись, если мы сделаем rfind для той же самой подстроки abc в нашей строке, то должна найтись пятерка, то есть позиция самого правого вхождения. И, действительно, вот она нашлась. То есть в зависимости от задачи, вы можете пользоваться методами find или rfind, чтобы искать вхождения слева направо или справа налево. У rfind есть также варианты с несколькими параметрами, с позиции, начиная с которой искать, заканчивая которой искать. Ну, это уже в некотором смысле экзотика: найти несколько последних вхождений. Довольно редкая задача. Понадобится — знайте, что оно существует, почитаете документацию, поймете, как это делается, и сделаете. Также у нас осталась еще парочка интересных методов, а именно метод replace. Replace заменяет одну подстроку на другую строку. Например, мы хотим подстроку abc заменить на подстроку, содержащую цифры 1, 2, 3, 4. [ЗВУК] Вот, у нас произошла замена. Что делает метод replace? Он не изменяет ту строку, для которой он был вызван, то есть строка остается неизменной, но возвращает новый объект с заменами. То есть все подстроки abc заменяются на заданные подстроки. Ну, собственно, что заменить на что заменить. Также существует replace с тремя параметрами, а третий параметр здесь означает, сколько вхождений, первых левых, заменить на одну подстроку на другую. Если мы сделаем 1, то у нас должно замениться только первое вхождение нашей подстроки. И, действительно, так оно и делается. У replace нет параметров, которые позволяют сообщать, с какого по какое заменять, но вы можете воспользоваться срезом, то есть сделать срез строки, внутри этого среза сделать replace, а затем вклеить его опять же с помощью нарезаний исходной строки обратно в исходную. То есть если вы хотите решить такую странную задачу, как заменить одну подстроку на другую где-то в середине, то вы должны сначала эту серединку аккуратно вырезать, в ней произвести замены, а потом склеить обратно вместе с ее левым и правым хвостом. У replace есть одна особенность, которую надо знать и понимать, а именно, как у нас replace осуществляет замены в случае, если в результате есть тоже что-то, что должно бы замениться. То есть, простой пример: 6 буковок a, и мы пытаемся две буквы a заменить на одну букву a. Вообще говоря, логика здесь может быть совершенно разная. Может оказаться, что у вас все превратится в одну букву a, то есть вы взяли первые две буквы а, заменили на одну, осталось 5. Опять первые две заменили на одну, осталось 4, и так далее. Но на самом деле здесь работает немного другая логика, а именно, у нас замена осуществляется только для непересекающихся строк. То есть в результате выполнения такой операции осталась не одна буква a, а три штуки. Первые две буквы a заменились на одну, и дальше мы рассматривать продолжаем только для хвоста, не пересекающегося с нашей подстрокой, то есть для последних четырех букв a мы это проверяем. Таким образом первые две буквы a заменяются на одну букву a, и затем только вот уже среди этих четырех последних символов осуществляются все остальные замены. Это нужно учитывать, когда вы захотите, например, поделать какие-то замены с учетом того, что в измененном результате вы опять хотите изменять. Это нужно делать по-другому. Нужно каждый раз менять строку и каждый раз делать ровно одну замену и запоминать снова результат. То есть как бы это могло выглядеть? [ЗВУК] Пока у нас есть наша хоть одна заменяемая подстрока, мы в s будем класть, то есть в нашу же строку будем записывать новое значение с одной произведенной заменой. Ну и все. Давайте потом напечатаем, что осталось от s. И вот такой способ должен нам дать ровно одну букву a, что он и делает. То есть каждый раз мы делаем одну замену и опять ищем сначала. Вот так реализуется такой способ замен, но в большинстве реальных задач, конечно, это не имеет в общем-то какого-то значения, совсем никакого значения, прямо скажем, но некоторые специфичные задачи требуют от вас одного или другого метода строго. Например, если вы изучали алгоритмы Маркова, достаточно теоретическую вещь, то вот в них как раз просто способ с replace будет работать, возможно, не совсем так, как вы ожидаете. Еще один полезный метод для строк — это метод count. Count позволяет подсчитать количество вхождений подстроки в строку. Например, мы можем посчитать количество вхождений отдельной буквы, то есть сколько раз какая-то буква встречается в нашей строке. Ну, вот буква a. В нашей строке такой буква a встречается дважды. В принципе, вы можете посчитать и не для буквы, а для любой подстроки, достаточно длинной, возможно. Ну, строка abc также входит дважды, а строка abcd всего один раз. Если строка вообще не входит ни разу, то мы получаем ноль, не минус единицу, а вполне ожидаемое значение — количество вхождений равно нулю. Давайте посмотрим, как count работает в той же ситуации, которую мы рассматривали с replace, то есть как считается количество вхождений подстроки aa из двух букв a в строку из шести букв a. Опять же, логичный результат: либо три, либо пять. Ну, наш результат три, то есть count точно так же как replace проверяет вхождение не пересекающихся подстрок. Ну, и понятно, что нужно делать, если вы хотите считать, включая пересекающиеся вхождения. Либо написать циклы со срезами, либо посмотреть, а что нам, собственно, метод count, какие его версии существуют кроме стандартной версии с одной подстрокой. Вот здесь нам на подсветке показывает, что у него есть параметры start и end, ну и можно подумать и решить, что это как раз и есть те позиции, начиная с которой и заканчивая которой, нужно считать. Причем, позиция заканчивая которой, опять же не включительно, как это принято в большинство мест в Python. То есть так же как мы делали цикл while для replace, мы можем сделать очень похожий цикл с count. Ну а пока что мы воспользуемся более простой вещью, посчитаем количество вхождений, начиная со второго символа. Таких вхождений два. Начиная с первого их тоже два. То есть по сути, мы берем последние пять символов, то есть все, кроме нулевого, начального символа, и считаем вхождения среди них. Функция count иногда бывает очень полезна, то есть посчитать, сколько раз у вас входит какое-то слово. Ну, опять же в стандартных функциях поиска, сейчас если вы в браузере или в каком-то текстовом редакторе считаете, у вас часто показывается, сколько вхождений нашлось или сколько замен было сделано. Кстати, это достаточно интересный эксперимент. Можете поэкспериментировать со своим текстовым редактором, которым вы пользуетесь, и попытаться в нем сделать замену одной подстроки на другую. Примерно так, как мы это делали с буквами a, то есть когда у нас получается в результате замен такое наложение, и посмотреть, как это работает в нем, так как в Python стандартный replace, то есть только для непересекающихся строк, или как мы делали более хитро, один раз — и что-то заменяется. Честно говоря, я не знаю, как это работает, возможно, по-разному в разных редакторах, но вот такой эксперимент можно поставить. Правда непонятно, какую пользу это вам принесет. Теперь вы знаете дополнительные методы для работы со строками в Python и сможете решить новые задачи, которые раньше решать не умели, гораздо проще, чем это могло бы делаться вручную. То есть понятное дело, что и замены, и подсчеты, и поиск подстроки в строке вы могли реализовать с помощью цикла, пройдясь по всем символам и сравнивая срезы, например, но в Python логика такая: если что-то реализовано в виде стандартной функции, то лучше пользоваться этим. Это короче, понятней, работает безошибочно, а главное быстрее, потому что питоновские программы, вообще говоря, не самые быстрые на свете, и если что-то есть стандартное, то нужно стараться пользоваться этим. [ЗВУК] [ЗВУК]