Ответ 1
rsplit
и join
могут использоваться для моделирования эффектов rreplace
>>> 'XXX'.join('mississippi'.rsplit('iss', 1))
'missXXXippi'
Я хочу сделать замену строки в Python, но только первый экземпляр идет справа налево. В идеальном мире я бы:
myStr = "mississippi"
print myStr.rreplace("iss","XXX",1)
> missXXXippi
Какой лучший способ сделать это, учитывая, что rreplace
не существует?
rsplit
и join
могут использоваться для моделирования эффектов rreplace
>>> 'XXX'.join('mississippi'.rsplit('iss', 1))
'missXXXippi'
>>> myStr[::-1].replace("iss"[::-1], "XXX"[::-1], 1)[::-1]
'missXXXippi'
>>> re.sub(r'(.*)iss',r'\1XXX',myStr)
'missXXXippi'
Механизм regex использует всю строку и затем начинает откат до тех пор, пока не будет найден iss
. Затем он заменяет найденную строку необходимым шаблоном.
Некоторая скорость тесты
Решение с [::-1]
оказывается быстрее.
Решение с re
было только быстрее для длинных строк (длиной более 1 миллиона символов).
вы можете изменить строку следующим образом:
myStr[::-1]
для замены просто добавьте .replace
:
print myStr[::-1].replace("iss","XXX",1)
однако теперь ваша строка обратная, поэтому переверните ее:
myStr[::-1].replace("iss","XXX",1)[::-1]
и все готово. Если ваши строки замены статические, просто отмените их в файле, чтобы уменьшить накладные расходы. Если нет, тот же трюк будет работать.
myStr[::-1].replace("iss"[::-1],"XXX"[::-1],1)[::-1]
def rreplace(s, old, new):
try:
place = s.rindex(old)
return ''.join((s[:place],new,s[place+len(old):]))
except ValueError:
return s
Это своего рода грязный взломать, но вы можете изменить строку и заменить ее также инвертированными строками.
"mississippi".reverse().replace('iss'.reverse(), 'XXX'.reverse(),1).reverse()