Какой метод используется для замены подстроки python?
Для замены подстроки можно использовать метод str.replace(old, new[, count]) . Он вернет копию строки, в которой все подстроки old будут заменены на new (необязательный параметр count указывает сколько замен нужно производить).
Так как строка неизменяемый формат, то метод возвращает именно копию. Но можно переприсвоить переменную, и замена «как будто» произойдет в той же строке.
a = 'The Young Pope' a.replace('Young', 'New') # 'The New Pope' a # 'The Young Pope' a = a.replace('Young', 'New') a # 'The New Pope'
String.prototype.replace()
Метод replace() возвращает новую строку с некоторыми или всеми сопоставлениями с шаблоном, заменёнными на заменитель. Шаблон может быть строкой или регулярным выражением, а заменитель может быть строкой или функцией, вызываемой при каждом сопоставлении.
Синтаксис
str.replace(regexp|substr, newSubStr|function[, flags])
Параметры
Объект регулярного выражения RegExp . Сопоставление заменяется возвращаемым значением второго параметра.
Строка, заменяемая на newSubStr . Обратите внимание, будет заменено только первое вхождение искомой строки.
Строка, заменяющая подстроку из первого параметра. Поддерживает несколько специальных шаблонов замены; смотрите ниже раздел Передача строки в качестве второго параметра.
Функция, вызываемая для создания новой подстроки (помещаемой вместо подстроки из первого параметра). Аргументы, передаваемые функции, описаны ниже в разделе Передача функции в качестве второго параметра.
Обратите внимание: аргумент flags не работает в ядре v8 (движок JavaScript в Chrome и NodeJs). Строка, задающая комбинацию флагов регулярного выражения. Параметр flags в методе String.prototype.replace() является нестандартным расширением. Вместо использования этого параметра используйте объект RegExp с соответствующими флагами. Значение этого параметра, если он используется, должно быть строкой, состоящей из одного или более следующих символов, следующим образом влияющих на обработку регулярного выражения:
сопоставление по нескольким строкам
«липкий» поиск, сопоставление начинается с текущей позиции в строке
Возвращаемое значение
Новая строка с некоторыми или всеми сопоставлениями шаблона, заменёнными на заменитель.
Описание
Этот метод не изменяет объект String , на котором он вызывается. Он просто возвращает новую строку.
Для выполнения глобального поиска и замены либо включите флаг g в регулярное выражение, либо, если первый параметр является строкой, включите флаг g в параметр flags .
Передача строки в качестве второго параметра
строка замены может включать следующие специальные шаблоны замены:
| Шаблон | Замена |
|---|---|
| $$ | Вставляет символ доллара «$». |
| $& | Вставляет сопоставившуюся подстроку. |
| $` | Вставляет часть строки, предшествующую сопоставившейся подстроке. |
| $’ | Вставляет часть строки, следующую за сопоставившейся подстрокой. |
| $n или $nn | Символы n или nn являются десятичными цифрами, вставляет n-ную сопоставившуюся подгруппу из объекта RegExp в первом параметре. |
Передача функции в качестве второго параметра
В качестве второго параметра вы можете передать функцию. В этом случае функция будет выполнена после произошедшего сопоставления. Результат вызова функции (её возвращаемое значение) будет использоваться в качестве строки замены (обратите внимание: описанные выше специальные шаблоны замены в этом случае не применяются). Обратите внимание, что функция будет вызвана несколько раз для каждого полного сопоставления, если регулярное выражение в первом параметре является глобальным.
Функция принимает следующие аргументы:
| Возможное имя | Получаемое значение |
|---|---|
| match | Сопоставившаяся подстрока (соответствует шаблону замены $& , описанному выше). |
| p1, p2, . | n-ная сопоставившаяся подгруппа из объекта RegExp в первом параметре метода replace() (соответствует шаблонам замены $1 , $2 и так далее, описанным выше). Например, если в качестве шаблона передано регулярное выражение /(\a+)(\b+)/ , параметр p1 будет значение сопоставления с подгруппой \a+ , а параметр p2 — с подгруппой \b+ . |
| offset | Смещение сопоставившейся подстроки внутри всей рассматриваемой строки (например, если вся строка равна ‘abcd’ , а сопоставившаяся подстрока равна ‘bc’ , то этот аргумент будет равен 1). |
| string | Вся рассматриваемая строка. |
Точное число аргументов будет зависеть от того, был ли первым аргументом объект RegExp и, если был, сколько подгрупп в нём определено.
Следующий пример установит переменную newString в значение ‘abc — 12345 — #$*%’ :
function replacer(match, p1, p2, p3, offset, string) // p1 - не цифры, p2 - цифры, p3 - не буквы и не цифры return [p1, p2, p3].join(" - "); > var newString = "abc12345#$*%".replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
Примеры
Пример: использование флагов global и ignore с методом replace()
В следующем примере регулярное выражение включает флаги для глобального поиска и игнорирования регистра, которые позволяют методу replace() заменить все вхождения слова «яблоки» в строке на слово «апельсины».
var re = /яблоки/gi; var str = "Яблоки круглые и яблоки сочные."; var newstr = str.replace(re, "апельсины"); console.log(newstr); // апельсины круглые и апельсины сочные.
Пример: передача регулярного выражения в метод replace()
В следующем примере в метод replace() передаётся регулярное выражение вместе с флагом игнорирования регистра.
// Ночь перед Рождеством, Xmas - сокращение для Christmas var str = "Twas the night before Xmas. "; var newstr = str.replace(/xmas/i, "Christmas"); console.log(newstr); // Twas the night before Christmas.
Пример выведет строку ‘Twas the night before Christmas. ‘
Пример: смена местами слов в строке
Следующий скрипт меняет местами слова в строке. В качестве текста замены он использует шаблоны замены $1 и $2 .
var re = /([А-ЯЁа-яё]+)\s([А-ЯЁа-яё]+)/; var str = "Джон Смит"; var newstr = str.replace(re, "$2, $1"); console.log(newstr); // Смит, Джон
Пример выведет строку ‘Смит, Джон’.
Пример: использование функции для изменения сопоставившихся символов
В этом примере все входящие в строку (латинские) буквы в верхнем регистре преобразуются в нижний регистр, а перед самой буквой вставляется дефис. Здесь важно то, что прежде чем элемент вставится в качестве замены, над ним нужно провести дополнительные преобразования.
Функция замены своим параметром принимает сопоставившийся кусок и перед возвратом использует его для преобразования регистра и соединения с дефисом.
function styleHyphenFormat(propertyName) function upperToHyphenLower(match) return "-" + match.toLowerCase(); > return propertyName.replace(/[A-Z]/g, upperToHyphenLower); >
Вызов styleHyphenFormat(‘borderTop’) вернёт строку ‘border-top’.
Поскольку мы хотим провести дополнительные преобразования результата сопоставления до того, как будет использована окончательная подстановка, мы должны использовать функцию. Это заставляет нас принудительно вычислить сопоставление перед использование метода toLowerCase() . Если бы мы попытались использовать сопоставление без функции, метод toLowerCase() не сработал бы.
var newString = propertyName.replace(/[A-Z]/g, "-" + "$&".toLowerCase()); // не работает
Происходит это потому, что сначала часть ‘$&’.toLowerCase() вычисляется в строковый литерал (результат по-прежнему равен ‘$&’ ), а только потом его символы используются в качестве шаблона.
Пример: замена градусов по Фаренгейту на эквивалент в градусах по Цельсию
В следующем примере градусы по Фаренгейту заменяются на эквивалентные градусы по Цельсию. Градусы по Фаренгейту должны быть числом, оканчивающимся на букву F. Функция возвращает количество градусов по Цельсию, оканчивающиеся на букву C. Например, если входное число равняется 212F, функция вернёт 100C. Если число равняется 0F, функция вернёт -17.77777777777778C.
Регулярное выражение test сопоставляется с любым числом, оканчивающимся на букву F. Количество градусов по Фаренгейту передаётся в функцию через её второй параметр, p1 . Функция переводит градусы по Фаренгейту, переданные в виде строки в функцию code>f2c(), в градусы по Цельсию. Затем функция f2c() возвращает количество градусов по Цельсию. Эта функция работает примерно так же, как и флаг s///e в Perl.
function f2c(x) function convert(str, p1, offset, s) return ((p1 - 32) * 5) / 9 + "C"; > var s = String(x); var test = /(\d+(?:\.\d*)?)F\b/g; return s.replace(test, convert); >
Пример: использование функции вместе с регулярным выражением для избавления от цикла for
Следующий пример принимает строку шаблона и преобразует её в массив объектов.
Входные данные:
Строка, состоящая из символов x , — и _
x-x_ x---x---x---x--- x-xxx-xx-x- x_x_x___x___x___
Выходные данные:
Массив объектов. Символ ‘x’ означает состояние ‘on’ , символ ‘-‘ (дефис) означает состояние ‘off’ , а символ ‘_’ (нижнее подчёркивание) означает продолжительность состояния ‘on’ .
[ on: true, length: 1 >, on: false, length: 1 >, on: true, length: 2 > . ]
Код:
var str = "x-x_"; var retArr = []; str.replace(/(x_*)|(-)/g, function (match, p1, p2) if (p1) retArr.push( on: true, length: p1.length >); > if (p2) retArr.push( on: false, length: 1 >); > >); console.log(retArr);
Этот код сгенерирует массив из трёх объектов в описанном формате без использования цикла for .
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-string.prototype.replace |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
- String.prototype.match()
- RegExp.prototype.exec()
- RegExp.prototype.test()
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2024 by individual mozilla.org contributors. Content available under a Creative Commons license.
Замена подстроки в строке
Найти в строке определенную последовательность символов (подстроку) и заменить ее другой.
- s , s_old , s_new — исходная строка, заменяемая подстрока, вставляемая подстрока;
- i – номер символа строки, с которого начинается подстрока;
- l_old – длина заменяемой подстроки.
Алгоритм решения задачи:
- Ввести строку, подстроку, которую требуется заменить, и подстроку, которую требуется вставить на место прежней.
- Найти место вхождения подстроки в строку с помощью функции pos().
- Удалить старую подстроку с помощью процедуры delete().
- Вставить новую подстроку, используя процедуру insert().
Программа на языке Паскаль:
var s,s_old,s_new: string; i,l_old: byte; begin write('Insert string: '); readln(s); write('What change? '); readln(s_old); l_old := length(s_old); write('What to replace? '); readln(s_new); i := pos(s_old,s); delete(s,i,l_old); insert(s_new,s,i); writeln(s); end.
Функция pos(subs, s) ищет вхождение подстроки subs в строке s и возвращает номер первого символа subs в s или нуль, если subs не содержится в s .
Процедура delete(s, start, len) удаляет из строки s , начиная с позиции start , подстроку длиной len .
Процедура insert(subs, s, start) вставляет в строку s подстроку subs , начиная с позиции start .
Если в строке несколько одинаковых подстрок, которые требуется заменить на новую подстроку, то следует воспользоваться циклом:
var s, s_old, s_new: string; i, l_old: byte; begin write('Введите строку: '); readln(s); write('Введите подстроку, которую требуется заменить: '); readln(s_old); l_old := length(s_old); write('Введите новую подстроку: '); readln(s_new); i := 1; while i <> 0 do begin i := pos(s_old, s); if i <> 0 then begin delete(s, i, l_old); insert(s_new, s, i); end; end; writeln(s); end.
Пример работы программы:
Введите строку: wsfgw sfkjsfii sf . Введите подстроку, которую требуется заменить: sf Введите новую подстроку: 0000 w0000gw 0000kj0000ii 0000 .
Пример решения похожей задачи в сообществе VK: Заменить в тексте сочетания букв «abc» на «klm»
Как можно реализовать алгоритм замены подстроки в строке?
Нужно реализовать следующий алгоритм:
В исходной строке A нужно заменить все вхождения подстроки B на строку C
Делать так нужно до тех пор, пока в строке A не останется подстрок B.
Гарантируется однозначное декодирование.
Если решать через string.Replace(. ) алгоритм займёт слишком много времени для больших строк.
Пример.
Вход: A = «abbacabba» B = «ba» C = «a»
Выход: aacaa
- Вопрос задан более года назад
- 284 просмотра
20 комментариев
Простой 20 комментариев
Neonoviiwolf @Neonoviiwolf
а ещё проверить, что после замены не образовались новые подходящие под замену подстроки
Алгоритм неполон и способен на некоторых исходных данных в зависимости от порядка поиска очередной подстроки давать разные результаты.
Возможные результаты обработки:
Wataru @wataru Куратор тега Алгоритмы
Дайте полное условие задачи. С ограничениями и примерами.
В общем случае быстрее string.replace не сделать.
LuVairo @LuVairo Автор вопроса
Петя и Вася продолжают придумывать все новые и новые шифры. На этот раз они кодируют сообщение следующим образом: выбирается две подстроки a – подстрока, содержащаяся в исходном тексте и b – подстрока, на которую заменяется подстрока a. Это преобразование может применяться к сообщению некоторое число раз, если в шифруемом сообщение после предыдущей замены все еще осталось вхождение подстроки a. При передаче сообщения сначала записывается зашифрованный текст, а затем две подстроки a и b. Вам необходимо написать программу для расшифровки сообщений, закодированных таким образом. Алгоритм действий таков: необходимо заменить все вхождения подстроки b на подстроку a. Если после этой замены строка стала отличной от исходной и в ней все еще остались вхождения подстроки b, они снова заменяются на подстроку a. Так продолжается до тех пор, пока применение этого преобразование приводит к изменению строки.
Формат ввода
На вход программа получает три значения:
исходную строку;
подстроку, которую необходимо заменить в исходной строке;
подстроку, на которую необходимо заменить подстроку из исходной строки.
Каждое значение вводится с новой строки. Гарантируется, что входная строка декодируется однозначно, то есть не может быть тестов вида:
bbb
b
ab