Рубрики
Без рубрики

Замените вхождения подстроки в строке на Python

В этом уроке мы продемонстрируем, как заменить все или *n* вхождения подстроки из строки в python с помощью replace(), sub() и subn() регулярными выражениями и примерами.

Автор оригинала: 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 предоставляет более разнообразный набор инструментов, который можно использовать для более узких задач, таких как поиск шаблонов и поиск без учета регистра.