Заменить в строке все вхождения word на letter

Обновлено: 02.07.2024

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

Допустим, у нас есть строка, содержащая следующее предложение:

Наша цель - заменить слово "brown" на "blue" :

В этой статье мы будем использовать функцию replace() , а также функции sub() и subn() с шаблонами для замены всех вхождений подстроки из строки.

replace()

Самый простой способ сделать это - использовать встроенную функцию - replace() :

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

Мы выполнили операцию над string_a , упаковали результат в string_b и распечатали их оба.

Этот код приводит к:

Опять же, строка в памяти, на которую указывает string_a , остается неизменной. Строки в Python неизменяемы, что просто означает, что вы не можете изменить строку. Однако вы можете повторно присвоить ссылочной переменной новое значение.

Чтобы, казалось бы, выполнить эту операцию на месте, мы можем просто переназначить string_a после операции:

Здесь новая строка, созданная методом replace() , присваивается переменной string_a .

Заменить n вхождений подстроки

А что, если мы не хотим изменять все вхождения подстроки? Что, если мы хотим заменить первые n?

Вот тут и появляется третий параметр функции replace() . Он представляет количество подстрок, которые будут заменены. Следующий код заменяет только первое вхождение слова "brown" на "blue" :

И в консоли у нас будет:

По умолчанию третий параметр настроен на изменение всех вхождений.

Вхождения подстроки в регулярных выражениях

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

Регулярные выражения - сложная тема с широким спектром использования в информатике, поэтому мы не будем вдаваться в подробности в этой статье.

По сути, регулярное выражение определяет шаблон. Например, предположим, что у нас есть текст о людях, владеющих кошками и собаками, и мы хотим заменить оба термина словом "pet" . Во-первых, нам нужно определить шаблон, который соответствует обоим терминам, например - (cat|dog) .

Использование функции sub()

Разобравшись с шаблоном, мы собираемся использовать функцию re.sub() со следующим синтаксисом:

Первый аргумент - это шаблон, который мы ищем (строка или объект Pattern ), repl это то, что мы собираемся вставить (может быть строкой или функцией; если это строка, обрабатываются любые escape-символы в ней обратной косой чертой) и string это строка, в которой мы ищем.

Необязательными аргументами являются count и flags , которые указывают, сколько вхождений необходимо заменить, и флаги, используемые для обработки регулярного выражения, соответственно.

Если шаблон не соответствует ни одной подстроке, исходная строка будет возвращена без изменений:

В консоле распечатается:

Сопоставление с шаблоном без учета регистра

Например, чтобы выполнить сопоставление с шаблоном без учета регистра, мы установим для параметра flag значение re.IGNORECASE :

Теперь любая комбинация регистра "dogs" также будет включена. При сопоставлении шаблона с несколькими строками, чтобы избежать его копирования в нескольких местах, мы можем определить объект Pattern . У них также есть функция sub() с синтаксисом:

Использование объектов шаблона

Давайте определим Pattern для кошек и собак и проверим пару предложений:

Что дает нам результат:

Функция subn()

Также есть метод subn() с синтаксисом:

Функция subn() возвращает кортеж со строкой и числом совпадений в строке поиска:

Кортеж выглядит так:

Объект Pattern содержит аналогичную функцию subn() :

И он используется очень похожим образом:

Вывод

Python предлагает простые функции для обработки строк. Самый простой способ заменить все вхождения данной подстроки в строке - использовать функцию replace() .

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


Основы

Введение в тему

В этом уроке мы рассмотрим как заменить подстроку внутри строки, используя метод replace().

Метод replace Python возвращает копию строки, в которой все вхождения искомой подстроки заменяются другой подстрокой.

Что делает метод

Слово replace переводится как «заменять», что название этого метода является отличным описанием того, что он делает. С помощью метода replace можно заменить часть строки, называемую подстрокой или её всю на другую строку. Метод replace позволяет гибко изменять только необходимые части строки str.

Синтаксис

Метод .replace() имеет следующий синтаксис:

Параметры

В качестве аргументов в метод передаются:

str — Строка, к которой применяется метод (тип данных string).

old — Подстрока, которую необходимо найти и заменить (тип данных string).

new — Новая подстрока, которой будет заменена старая (тип данных string).

count— Необязательный аргумент. Количество совпадений старой подстроки, которую необходимо заменить (тип данных int). Если этот параметр не указать, то будут заменены все вхождения подстрок на новые.

Вот несколько примеров применения метода:

Возвращаемое значение

Метод возвращает копию строки, в которой старая подстрока заменяется новой подстрокой. Строка, к которой применяется метод остаётся неизменной. Если искомая подстрока не обнаружена, то возвращается копия исходной строки.

Применение replace для замены нескольких значений

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

С помощью словаря

Предыдущий пример позволяет заменить несколько элементов, однако все они имеют одно и то же значение «i». Если необходимо заменить несколько разных значений, например «i» на «I» и «a» на «A», то необходимо реализовать чуть более сложную программу с использованием словарей:

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

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

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

Для решения этой проблемы можно заменить обычный словарь на упорядоченный словарь OrderedDict, который нужно импортировать следующей командой:

Эта функция возвращает строку или массив, в котором все вхождения search в subject заменены на replace .

Если не нужны сложные правила поиска/замены (например, регулярные выражения), использование этой функции предпочтительнее preg_replace() .

Список параметров

Если search и replace - массивы, то str_replace() использует каждое значение из соответствующего массива для поиска и замены в subject . Если в массиве replace меньше элементов, чем в search , в качестве строки замены для оставшихся значений будет использована пустая строка. Если search - массив, а replace - строка, то эта строка замены будет использована для каждого элемента массива search . Обратный случай смысла не имеет.

Если search или replace являются массивами, их элементы будут обработаны от первого к последнему.

Искомое значение, также известное как needle (иголка). Для множества искомых значений можно использовать массив.

Значение замены, будет использовано для замены искомых значений search . Для множества значений можно использовать массив.

Строка или массив, в котором производится поиск и замена, также известный как haystack (стог сена).

Если subject является массивом, то поиск с заменой будет осуществляться над каждым элементом subject , а результатом функции также будет являться массив.

Если передан, то будет установлен в количество произведенных замен.

Возвращаемые значения

Эта функция возвращает строку или массив с замененными значениями.

Примеры

<?php
// присваивает <body text='black'>
$bodytag = str_replace ( "%body%" , "black" , "<body text='%body%'>" );

// присваивает: Hll Wrld f PHP
$vowels = array( "a" , "e" , "i" , "o" , "u" , "A" , "E" , "I" , "O" , "U" );
$onlyconsonants = str_replace ( $vowels , "" , "Hello World of PHP" );

// присваивает: You should eat pizza, beer, and ice cream every day
$phrase = "You should eat fruits, vegetables, and fiber every day." ;
$healthy = array( "fruits" , "vegetables" , "fiber" );
$yummy = array( "pizza" , "beer" , "ice cream" );

$newphrase = str_replace ( $healthy , $yummy , $phrase );

// присваивает: 2
$str = str_replace ( "ll" , "" , "good golly miss molly!" , $count );
echo $count ;
?>

<?php
// Порядок замены
$str = "Строка 1\nСтрока 2\rСтрока 3\r\nСтрока 4\n" ;
$order = array( "\r\n" , "\n" , "\r" );
$replace = '<br />' ;

// Обрабатывает сначала \r\n для избежания их повторной замены.
echo $newstr = str_replace ( $order , $replace , $str );

// Выводит F, т.к. A заменяется на B, затем B на C, и так далее.
// В итоге E будет заменено F, так как замена происходит слева направо.
$search = array( 'A' , 'B' , 'C' , 'D' , 'E' );
$replace = array( 'B' , 'C' , 'D' , 'E' , 'F' );
$subject = 'A' ;
echo str_replace ( $search , $replace , $subject );

// Выводит: яблорехкорех орех (по вышеуказанной причине)
$letters = array( 'я' , 'о' );
$fruit = array( 'яблоко' , 'орех' );
$text = 'я о' ;
$output = str_replace ( $letters , $fruit , $text );
echo $output ;
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Так как str_replace() осуществляет замену слева направо, то при использовании множественных замен она может заменить ранее вставленное значение на другое. Смотрите также примеры на этой странице.

Замечание:

Эта функция чувствительна к регистру. Используйте str_ireplace() для замены, нечувствительной к регистру.

Читайте также: