Автор оригинала: Kristina Popovic.
Вступление
Замена всех или n вхождений подстроки в данной строке является довольно распространенной проблемой манипулирования строками и обработки текста в целом. К счастью, большинство этих задач облегчаются в Python благодаря огромному набору встроенных функций, включая эту.
Допустим, у нас есть строка, содержащая следующее предложение:
The brown-eyed man drives a brown car.
Наша цель-заменить слово "коричневый"
словом "синий"
:
The blue-eyed man drives a blue car.
В этой статье мы будем использовать функцию replace ()
, а также функции sub()
и sub()
с шаблонами для замены всех вхождений подстроки из строки.
заменять()
Самый простой способ сделать это-использовать встроенную функцию – replace()
:
string.replace(oldStr, newStr, count)
Первые два параметра являются обязательными, а третий-необязательным. oldest
– это подстрока, которую мы хотим заменить на newStr
. Стоит отметить, что функция возвращает новую строку с выполненным преобразованием, не затрагивая исходную.
Давайте попробуем:
string_a = "The brown-eyed man drives a brown car." string_b = string_a.replace("brown", "blue") print(string_a) print(string_b)
Мы выполнили операцию над string_a
, упаковали результат в string_b
и напечатали их оба.
Этот код приводит к:
The brown-eyed man drives a brown car. The blue-eyed man drives a blue car.
Опять же, строка в памяти, на которую указывает string_a
, остается неизменной. Строки в Python неизменяемы, что просто означает, что вы не можете изменить строку. Однако вы можете повторно присвоить ссылочной переменной новое значение.
Чтобы , казалось бы, выполнить эту операцию на месте , мы можем просто переназначить string_a
самому себе после операции:
string_a = string_a.replace("brown", "blue") print(string_a)
Здесь новая строка, сгенерированная методом replace ()
, присваивается переменной string_a
.
Заменить n вхождений подстроки
Теперь, что делать, если мы не хотим изменять все вхождения подстроки? Что делать, если мы хотим заменить первый n ?
Вот тут-то и появляется третий параметр функции replace ()
. Он представляет собой количество подстрок, которые будут заменены. Следующий код заменяет только первое вхождение слова "коричневый"
словом "синий"
:
string_a = "The brown-eyed man drives a brown car." string_a = string_a.replace("brown", "blue", 1) print(string_a)
А это отпечатки:
The blue-eyed man drives a brown car.
По умолчанию третий параметр настроен на изменение всех вхождений.
Вхождения подстрок с регулярными выражениями
Чтобы еще больше обострить проблему, предположим, что мы хотим не только заменить все вхождения определенной подстроки, но и заменить все подстроки, которые соответствуют определенному шаблону. Даже это можно сделать с помощью однострочной строки, используя регулярные выражения и модуль стандартной библиотеки re
.
Регулярные выражения-это сложная тема с широким спектром использования в информатике, поэтому мы не будем слишком углубляться в эту статью, но если вам нужно быстро начать, вы можете ознакомиться с нашим руководством по регулярным выражениям в Python .
По своей сути регулярное выражение определяет шаблон. Например, допустим, у нас есть текст о людях, которые владеют кошками и собаками, и мы хотим изменить оба термина словом "домашнее животное"
. Во – первых, нам нужно определить шаблон, который соответствует обоим терминам, таким как – (кошка|собака)
.
Использование функции sub()
Разобравшись с шаблоном, мы воспользуемся функцией re.sub ()
, которая имеет следующий синтаксис:
re.sub(pattern, repl, string, count, flags)
Первый аргумент-это шаблон, который мы ищем (строка или объект Pattern
), repl
– это то, что мы собираемся вставить (может быть строкой или функцией; если это строка, то любые экранирования обратной косой черты в ней обрабатываются), а string
– это строка, в которой мы ищем.
Необязательными аргументами являются count
и flags
, которые указывают, сколько вхождений необходимо заменить, и флаги, используемые для обработки регулярного выражения, соответственно.
Если шаблон не соответствует какой-либо подстроке, исходная строка будет возвращена без изменений:
import re string_a = re.sub(r'(cat|dog)', 'pet', "Mark owns a dog and Mary owns a cat.") print(string_a)
Этот код печатается:
Mark owns a pet and Mary owns a pet.
Сопоставление Шаблонов Без Учета Регистра
Например, для выполнения сопоставления с шаблоном без учета регистра мы установим параметр flag в re.IGNORECASE
:
import re string_a = re.sub(r'(cats|dogs)', "Pets", "DoGs are a man's best friend", flags=re.IGNORECASE) print(string_a)
Теперь любой случай-комбинация "собаки"
также будет включена. При сопоставлении шаблона с несколькими строками, чтобы избежать копирования его в нескольких местах, мы можем определить объект Pattern
. У них также есть функция sub()
с синтаксисом:
Pattern.sub(repl, string, count)
Использование объектов Шаблона
Давайте определим Шаблон
для кошек и собак и проверим пару предложений:
import re pattern = re.compile(r'(Cats|Dogs)') string_a = pattern.sub("Pets", "Dogs are a man's best friend.") string_b = pattern.sub("Animals", "Cats enjoy sleeping.") print(string_a) print(string_b)
Что дает нам выход:
Pets are a man's best friend. Animals enjoy sleeping.
Функция sub()
Существует также метод sub()
с синтаксисом:
re.subn(pattern, repl, string, count, flags)
Функция sub()
возвращает кортеж со строкой и количеством совпадений в строке, которую мы искали:
import re string_a = re.subn(r'(cats|dogs)', 'Pets', "DoGs are a mans best friend", flags=re.IGNORECASE) print(string_a)
Кортеж выглядит так:
('Pets are a mans best friend', 1)
Объект Pattern
содержит аналогичную функцию sub()
:
Pattern.subn(repl, string, count)
И он используется очень похожим образом:
import re pattern = re.compile(r'(Cats|Dogs)') string_a = pattern.subn("Pets", "Dogs are a man's best friend.") string_b = pattern.subn("Animals", "Cats enjoy sleeping.") print(string_a) print(string_b)
Это приводит к:
("Pets are a man's best friend.", 1) ('Animals enjoy sleeping.', 1)
Вывод
Python предлагает простые и простые функции для обработки строк. Самый простой способ заменить все вхождения данной подстроки в строке-это использовать функцию replace ()
.
При необходимости модуль стандартной библиотеки re
предоставляет более разнообразный набор инструментов, который можно использовать для более узких задач, таких как поиск шаблонов и поиск без учета регистра.