Rreplace - Как заменить последнее вхождение выражения в строку?
Есть ли быстрый способ в Python заменить строки, но вместо начала с начала, как replace
делает, начиная с конца? Например:
>>> def rreplace(old, new, occurrence)
>>> ... # Code to replace the last occurrences of old by new
>>> '<div><div>Hello</div></div>'.rreplace('</div>','</bad>',1)
>>> '<div><div>Hello</div></bad>'
Ответы
Ответ 1
>>> def rreplace(s, old, new, occurrence):
... li = s.rsplit(old, occurrence)
... return new.join(li)
...
>>> s
'1232425'
>>> rreplace(s, '2', ' ', 2)
'123 4 5'
>>> rreplace(s, '2', ' ', 3)
'1 3 4 5'
>>> rreplace(s, '2', ' ', 4)
'1 3 4 5'
>>> rreplace(s, '2', ' ', 0)
'1232425'
Ответ 2
Я не буду притворяться, что это самый эффективный способ сделать это, но это простой способ. Он реверсирует все строки, о которых идет речь, выполняет обычную замену с помощью str.replace
на обратных строках, а затем возвращает результат обратно вправо:
>>> def rreplace(s, old, new, count):
... return (s[::-1].replace(old[::-1], new[::-1], count))[::-1]
...
>>> rreplace('<div><div>Hello</div></div>', '</div>', '</bad>', 1)
'<div><div>Hello</div></bad>'
Ответ 3
Если вы знаете, что "старая" строка не содержит специальных символов, вы можете сделать это с помощью регулярного выражения:
In [44]: s = '<div><div>Hello</div></div>'
In [45]: import re
In [46]: re.sub(r'(.*)</div>', r'\1</bad>', s)
Out[46]: '<div><div>Hello</div></bad>'
Ответ 4
Вот рекурсивное решение проблемы:
def rreplace(s, old, new, occurence = 1):
if occurence == 0:
return s
left, found, right = s.rpartition(old)
if found == "":
return right
else:
return rreplace(left, old, new, occurence - 1) + new + right