Замена символов в строке в Python

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

Скачивайте книги ТОЛЬКО на русском языке у нас в телеграм канале: PythonBooksRU

Но прежде чем двигаться дальше, давайте припомним, что такое строки. В Python все является объектом. Строки также являются объектами Python, но обычно они определяются как последовательность символов, заключенных в кавычки ( ‘ ‘ или ” ” ). Эти символы могут быть буквенными (a-z, A-Z), цифровыми (0-9) или специальными (например, $, %), а также пробелами (‘ ‘).

Что подразумевается под заменой символов в строке?

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

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

  1. Замена одного символа в строке на другой символ. Допустим, у нас есть строка “Favtutor”, и мы хотим заменить первое вхождение “t” на “T”.
  2. Замена всех вхождений символа в строке другим символом. Возьмем тот же пример. Предположим, вы хотите заменить оба вхождения символа “t” в строке “Favtutor” на “T”. В результате получится строка: “FavTuTor”.
  3. Замена нескольких символов в строке одним и тем же символом. Например, у вас есть строка “Hello world”, и вы хотите заменить символы “l” и “o” на другой символ, скажем на “!”. В результате получится: “He!!! W!r!d”.
  4. Замена нескольких символов в строке другими символами (разными). Для примера возьмем предложение “Strings are immutable”. Вам нужно заменить символы [‘r’, ‘m’, ‘i’], на [‘R’, ‘!’, ‘M’], в соответствующем порядке, то есть “r” заменить на “R”, “M” заменить на “!”, а “i” заменить на “M”. На выходе получится “StRMngs aRe M!!utable”.
  5. Удаление символов в строке. Например, рассмотрим строку “Fav Tutor”. Допустим, вам нужно удалить пробел (‘ ‘) между “Fav” и “Tutor”. Вы можете удалить этот пробел, заменив его на пустую строку. Результатом будет “FavTutor”.

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

Ну, строки неизменяемы! Методы (вы скоро их узнаете) принимают исходную строку на вход и возвращают измененную (после замены символов) строку на выход. Этот результат сохраняется в другой строковой переменной. То есть нам нужна еще одна переменная (объект string) для хранения полученного результата. А вот исходная строка не изменяется.

Как заменить несколько символов в строке в Python?

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

Использование метода replace()

Для замены символов в строке Python предлагает метод replace(). Этот метод возвращает новый объект (строку), заменяя указанные поля (символы) новыми значениями.

Метод replace() принимает на вход два параметра: шаблон, который вы хотите заменить (найти в строке), и шаблон (символ), на который вы хотите заменить.

Наиболее используемый синтаксис для replace() следующий:

newObject = originalString.replace('символ, который нужно заменить', 'символ, которым нужно заменить' )

Рассмотрим пример:

string = "Bubblegum"

# Заменить символ 'b' символом 'B'
changed_string = string.replace("b", "B")

print("Original string: ", string)
print("New string: ", changed_string)

Вывод:

Original string:  Bubblegum
New string:  BuBBlegum

Обратите внимание, что оба символа “b” в исходной строке “Bubblegum” заменяются символами “B”. Это пример замены нескольких вхождений одного символа в строке.

Примечание редакции: вас также может заинтересовать статья “Как перевести строку в нижний регистр в Python”.

Метод replace() также имеет третий параметр (необязательный), в котором вы можете указать количество замен, которые вы хотите выполнить.

То есть, если в каком-либо слове имеется более одного вхождения символа, который нужно заменить, то мы можем ввести третий параметр, указав, сколько одинаковых символов подлежат замене. Например, в случае с “Bubblegum” можно указать в качестве третьего параметра 1, чтобы заменить только одну “b” в строке.

Таким образом, полный синтаксис метода replace() следующий:

newObject = originalString.replace('символ, который нужно заменить', 'символ, которым нужно заменить', число замен)

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

string = "Bubblegum"

# Заменить символ 'b' символом 'B'
changed_string = string.replace("b", "B", 1)

print("Original string: ", string)
print("New string: ", changed_string)

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

Вывод:

Original string:  Bubblegum
New string:  BuBblegum

Обратите внимание, что только первое вхождение “b” было заменено на “B”. Это произошло потому, что количество замен было установлено равным 1.

Использование replace() со списками

Метод replace() можно также использовать для замены нескольких разных символов на другой символ (или несколько разных).

Наиболее распространенным способом работы со списками является использование цикла for. Чтобы заменить несколько символов (допустим, разных) с помощью метода replace(), можно перечислить все удаляемые символы в списке.

Пример объявления списка:

string = "FavTutor Blog: How to Remove multiple characters in a string in Python"

# Допустим, нам нужно заменить символы 't', 'l', 'r'.
# Создание списка из этих символов:
char_remov = ['t', 'l', 'r']

Вы можете задаться вопросом, зачем нам создавать список или даже использовать цикл for, если мы можем напрямую вызвать replace() для каждого из символов. Позже мы это разберем.

После инициализации списка вы можете заменить упомянутые символы либо на один и тот же символ, либо на несколько символов (т.е. для каждого из символов будет своя замена).

Замена нескольких символов на один и тот же символ:

string = "FavTutor Blog: How to Remove multiple characters in a string in Python"
char_remov = ["t", "l", "r"]

print("Original string: " + string)

# Допустим, мы хотим заменить символы в списке символом '#'
for char in char_remov:
    # replace() "возвращает" измененную строку
    string = string.replace(char, "#")

print("Altered string: " + string)

Как видите, я использовал цикл for для перебора строк в списке, заменяя каждую на символ “#”.

Вывод:

Original string: FavTutor Blog: How to Remove multiple characters in a string in Python
Altered string: FavTu#o# B#og: How #o Remove mu##ip#e cha#ac#e#s in a s##ing in Py#hon

Еще раз обратите внимание, что мы заменили несколько символов (элементы в списке char_remov) на один и тот же символ (“#”).

Использование replace() со словарем

Для замены можно использовать не один и тот же символ, а разные. Для этого применяются словари.

Что такое словарь в Python? Словарь – это коллекция пар ключ-значение. Это тип данных, который также считается реализацией структуры данных ассоциативного массива в Python. Словари изменяемы и не допускают дубликатов, поскольку ключ может иметь только одно значение.

Примечание редакции: подробнее о словарях читайте в статье “Словари в Python и работа с ними”.

Пример словаря можно представить следующим образом:

# dictionary = {'key' : value}
dictionary = {"FavTutor": "blogs", "language": "Python"}

# Доступ к значениям словаря
value1 = dictionary.get("FavTutor")
print("Values: ", value1, " in ", dictionary.get("language"))

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

Вывод:

Values:  blogs  in  Python

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

Замена нескольких символов разными символами в строке в Python:

string = "Favtutor Blog: How to Remove multiple characters in a string in Python"
# Символы, которые нужно заменить - 't', 'l', 'r', 's'
# Символы, которыми нужно заменить -'T', 'L', 'R', 'S'

print("Original string: ", string)

""" Создание словаря для замены символов
key - символ, который будет заменен
value - символ, которым будет заменен символ в ключе """

to_remov = {"t": "T", "l": "L", "r": "R", "s": "S"}

# .keys() возвращает список всех ключей словаря
for char in to_remov.keys():
    # dictionaryName[keys] - еще один способ получить значение
    string = string.replace(char, to_remov[char])

print("Altered string: " + string)

Вывод:

Original string:  Favtutor Blog: How to Remove multiple characters in a string in Python
Altered string: FavTuToR BLog: How To Remove muLTipLe chaRacTeRS in a STRing in PyThon

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

Надеюсь, вы нашли ответ на наш вопрос: “Зачем нам нужен цикл?”.

Поскольку нам нужно заменить несколько символов в строке, необходимость в цикле действительно очевидна. Мы можем вызывать метод replace() для каждого удаляемого символа, но как долго вы собираетесь повторять этот процесс? А в случае большого количества символов, подлежащих замене, вызов replace() для каждого символа не только увеличивает длину вашего кода, но и ухудшает его читабельность.

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

Помните об этом. Это довольно элементарно, но может часто встречаться в интервью!

Метод replace() является наиболее распространенным методом замены любого символа. Замена нескольких символов в строке в Python может осуществляться любым из приведенных способов. Специальные символы (например, ‘|’), также можно использовать с выражениями. Такое использование специальных символов или шаблонов для замены используется в регулярных выражениях (или RegEx).

Замена символов в строке при помощи модуля re

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

Есть два основных способа замены символов:

  1. Использование функции sub() с метасимволами или специальными последовательностями.
  2. Использование функции sub() со списками и словарями.

Прежде чем перейти к этим методам, давайте познакомимся с функцией sub().

Функция sub() в модуле re

Модуль re в Python предлагает функцию sub(), которая заменяет указанный символ на другой. В результате возвращается строка с новыми символами. Обратите внимание, что для использования функции sub() необходимо импортировать модуль re.

Основной синтаксис функции sub() следующий:

newString = re.sub('символ, который нужно заменить', 'символ, которым нужно заменить', имяСтроки)

Чтобы понять, как работает функция sub(), рассмотрим пример замены одного символа другим:

import re

string = "Favtutor"
print("Original string: ", string)
"""Символ, который нужно заменить = 't',
символ, которым нужно заменить = 'T'. """

# Вызов функции sub()
newString = re.sub("t", "T", string)

print("The new string: ", newString)

Здесь ‘t’ считается регулярным выражением. Также обратите внимание, что, в отличие от метода replace(), здесь имя строки передается в качестве входного параметра.

Вывод:

Original string:  Favtutor
The new string:  FavTuTor

Функция sub() ищет в строке шаблон (символ), а затем заменяет соответствующий шаблону символ новым символом. Она возвращает новую строку с произведенными изменениями. Обратите внимание, что здесь тоже можно указать количество замен, передав в конце параметр count. Следовательно, полный синтаксис sub() будет таким:

newString = re.sub('символ, который нужно заменить', 'символ, которым нужно заменить', имяСтроки, count )

Теперь перейдем к замене нескольких символов с помощью функции sub() и специальных символов!

Использование sub() с метасимволами или специальными последовательностями

Напомним, что метасимволы – это символы со специальным значением (например, “|” означает “или-или”) и специальные последовательности, такие как “\s” для пробелов. Эти метасимволы или специальные последовательности могут быть использованы для замены нескольких символов в строке.

Рассмотрим пример замены нескольких символов в строке одним символом с использованием специальных последовательностей и метасимволов.

import re

string = "A master of all is a master of none"
print("Original string: ", string)

# Мы хотим заменить символы 'm', 'n' и пробелы 
# символом '#'

# Вызов функции sub()
# Пробелы представляются специальной последовательностью '\s'
# '|' используется как ИЛИ

string = re.sub("m|n|\s", "#", string)
print("New string: ", string)

Вывод:

Original String:  A master of all is a master of none
New string:  A##aster#of#all#is#a##aster#of##o#e

Обратите внимание, что в приведенном примере я использовал специальную последовательность (“\s”), а также метасимвол (“|”).

Это еще один способ замены нескольких символов с помощью функции sub(). Но его можно использовать, если заменяемых символов немного. Как и раньше, для замены большого количества символов нам понадобится цикл.

Использование sub() со словарем

Функция sub() также может использоваться как со списками, так и со словарями. Рассмотрим пример использования функции sub() со словарем. Заменим несколько символов в строке разными символами.

import re

string = "Favtutor Blog: How to Remove multiple characters in a string in Python"

# Символы, которые нужно заменить - 't', 'l', 'r', 's'
# Символы, которыми нужно заменить -'T', 'L', 'R', 'S'

print("Original string: ", string)

""" Создание словаря для замены символов
key - символ, который нужно заменить
value - символ, которым нужно заменить """

to_remov = {"t": "T", "l": "L", "r": "R", "s": "S"}

# .keys() возвращает список всех ключей в словаре
for char in to_remov.keys():
    # dictionaryName[keys] - еще один способ получить значение
    # Вызов функции sub из модуля re
    string = re.sub(char, to_remov[char], string)

print("Altered string: " + string)

Последовательности символов, на которые ссылается char, и значения в словаре являются регулярными выражениями.

Вывод:

Original string:  Favtutor Blog: How to Remove multiple characters in a string in Python
Altered string: FavTuToR BLog: How To Remove muLTipLe chaRacTeRS in a STRing in PyThon

Помимо функции sub(), модуль re также предлагает аналогичную ей функцию subn(). Единственное отличие заключается в том, что функция subn() также выдает количество замен, которые она произвела в строке. А функцию sub() можно использовать с лямбда-функциями.

Попробуйте использовать приведенные выше функции. Они могут привести вас к желаемому результату.

Замена символов в строке при помощи translate() и maketrans()

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

Метод maketrans() генерирует таблицу сопоставления (словарь) между исходным символом и его заменой. Смотрите пример ниже:

# Исходная строка
string = "Hi, my name is mradula mittal. i'm a machine learning enthusiast."
# Вызов метода maketrans() для замены 'mi' на 'MI'
transTable = string.maketrans("mi", "MI")

# Вывод результата работы maketrans()
print(transTable)

Вывод:

{109: 77, 105: 73}

Метод maketrans() создает таблицу (словарь), отображающую старые значения на новые. Обратите внимание, что этот словарь содержит ASCII-значения символов (как заменяемых, так и заменяющих).

Функция translate() принимает таблицу сопоставления, созданную maketrans(), и генерирует переведенную строку. Посмотрите на пример замены нескольких символов в строке в Python:

# Исходная строка
string = "Hi, my name is mradula mittal. i'm a machine learning enthusiast."
# Вызов метода maketrans() для замены 'mi' на 'MI'
translateTable = string.maketrans("mi", "MI")
output = string.translate(translateTable)

print("Original string: ", string)
print('Output: ', output)

Вывод:

Original string:  Hi, my name is mradula mittal. i'm a machine learning enthusiast.
Output:  HI, My naMe Is Mradula MIttal. I'M a MachIne learnIng enthusIast. 

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

Сравнение методов translate() и replace()

Метод translate() и метод replace() – встроенные функции Python для замены символов в строке. Для выполнения этой задачи можно использовать любой из них. Но давайте их сравним, чтобы понять, когда какой более уместен.

Метод translate() заменяет только одиночные символы в строке, тогда как метод replace() позволяет заменять строки произвольной длины. Например:

string = "Hi, my name is mradula mittal. i'm a machine learning enthusiast."
translateTable = string.maketrans("mit", "MI")
output = string.translate(translateTable)

print("Original string: ", string)
print("Output: ", output)

Вывод

Traceback (most recent call last):
  File ".\temp.py", line 5, in <module>
    translateTable = string.maketrans("mit", "MI")
ValueError: the first two maketrans arguments must have equal length

Обратите внимание на ошибку, полученную при вызове метода maketrans(). Она возникла из-за разницы в длине заменяемых и заменяющих подстрок. Теперь давайте посмотрим, как в такой ситуации отработает метод replace():

string = "Hi, my name is mradula mittal. i'm a machine learning enthusiast."
output = string.replace("mit", "M")

print("Original string: ", string)
print("Output: ", output)

Метод replace() рассматривает аргумент “mit” как строку в целом, а не как последовательность отдельных символов. Кроме того, аргументы не обязательно должны быть одинаковой длины.

Вывод:

Original string:  Hi, my name is mradula mittal. i'm a machine learning enthusiast.
Output:  Hi, my name is mradula Mtal. i'm a machine learning enthusiast. 

Как видите, вместо замены символов ‘m’, ‘i’, ‘t’, метод replace() заменил на ‘M’ только подстроку ‘mit’.

И еще пара отличий

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

Метод translate() можно использовать, когда вы не уверены, не подлежат ли замене и новые символы (символы, на которые нужно заменить).

Сложно? Не волнуйтесь, давайте рассмотрим пример, чтобы понять вышеприведенные сравнения. Допустим, у нас есть строка ‘abcd’. Нам нужно заменить символы ‘a’ на ‘b’, ‘b’ на ‘c’ и ‘c’ на ‘d’.

Короче говоря, вход = ‘abcd’ и ожидаемый вывод = ‘bcdd’

Давайте сравним оба метода на приведенных выше исходных данных:

original = "abcd"
# Заменяем 'a' -> 'b' , 'b' -> 'c', 'c' -> 'd'

# Вызов метода maketrans()
translateTable = original.maketrans("abc", "bcd")
output = original.translate(translateTable)

print("Original string: ", original)
print("Using translate() method - Output: ", output)

# Вызов метода replace() 

output = original.replace('a', 'b').replace('b', 'c').replace('c', 'd')
# Это похоже на использование цикла for

print("Original string: ", original)
print("Using replace() method - Output: ", output)

Обратите внимание на разницу между результатами, возвращаемыми обоими методами.

Вывод:

Original string:  abcd
Using translate() method - Output:  bcdd
Original string:  abcd
Using replace() method - Output:  dddd

Методы вернули разные результаты! Вы, наверное, задаетесь вопросом “как”, верно? Это произошло потому, что метод replace() выполнялся в цикле, один за другим. Давайте перечислим изменения для лучшего понимания:

  1. Вводим = ‘abcd’
  2. Заменяем ‘a’ на ‘b’ => строка = ‘bbcd’
  3. Заменяем ‘b’ на ‘c’ => строка = ‘cccd’
  4. Заменяем ‘c’ на ‘d’ => ‘dddd’

Следовательно, на выходе = ‘dddd’.

В данном случае ожидаемый результат дает метод translate().

Таким образом, сравнивая оба метода, можно заметить, что при замене нескольких символов следует использовать метод translate(), так как он повышает функциональность. Хотя метод replace() имеет свои преимущества в оптимизации времени.

Заключение

В этой статье мы рассмотрели, как с помощью встроенных функций Python происходит замена нескольких символов в строке. Эта задача также может быть выполнена с помощью различных вариаций циклов. Надеюсь, эта статья поможет вам найти подходящий метод для вашего кода. Успешного кодинга!

Перевод статьи Mradula Mittal «5 Ways to Replace Multiple Characters in String in Python».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *