2012-03-30 3 views
35

Я хочу сделать замену строки в Python, но только первый экземпляр идет справа налево. В идеальном мире я бы:Строка справа налево в Python?

myStr = "mississippi" 
print myStr.rreplace("iss","XXX",1) 

> missXXXippi 

Какой самый лучший способ сделать это, учитывая, что rreplace не существует?

+6

отн: http://stackoverflow.com/q/2556108/989121 – georg

ответ

58

rsplit и join могут быть использованы для имитации эффектов в rreplace

>>> 'XXX'.join('mississippi'.rsplit('iss', 1)) 
'missXXXippi' 
+5

+1 для решения, которое легко поддается программистам, которые следуют. – strongMA

+0

+1 Это лучший ответ! – uccie

+1

В отличие от других решений, этот также легко расширяется для выполнения нескольких замен справа. – Anaphory

20
>>> myStr[::-1].replace("iss"[::-1], "XXX"[::-1], 1)[::-1] 
'missXXXippi' 
+8

, который так * не * новичку дружественный ... :) – brice

+0

Я предполагаю, что это делает то, что делает @ sleepplessnerd, но без «обратного»? – fredley

+0

@brice Если это работает, мне все равно – fredley

0

Это своего рода грязный взломать, но вы можете поменять строку и заменить ее также инвертированными строками.

"mississippi".reverse().replace('iss'.reverse(), 'XXX'.reverse(),1).reverse() 
+11

Нет метода 'reverse()' для строк. –

6

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

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] 
+2

вы забыли изменить согласованный текст и текст замены – sleeplessnerd

+1

Нет, я сказал в конце, что делать, если вы хотите, чтобы они были отменены. – Serdalis

14
>>> re.sub(r'(.*)iss',r'\1XXX',myStr) 
'missXXXippi' 

Регулярное выражение двигателя cosumes всю строку, а затем начинается откат недо iss найден. Затем он заменяет найденную строку необходимым шаблоном.


Некоторые скорость tests

Решение с [::-1] оказывается быстрее.

Решение с re было выполнено только для длинных строк (длиной более 1 миллиона символов).

+0

Является ли это более эффективным, чем метод разворота для коротких строк (<20 символов)? – fredley

+0

@TomMedley Я не знаю. Я не делал никаких тестов скорости. Как я знаю, откат медленный. И если 'iss' находится где-то в начале строки, потребуется довольно долгое время, чтобы обнаружить брешь, пока двигатель не найдет позицию, где' iss' соответствует. – ovgolovin

+0

@TomMedley Но я не думаю, что эти '[:: - 1]' в других решениях быстрее :) – ovgolovin

2
def rreplace(s, old, new): 
    try: 
     place = s.rindex(old) 
     return ''.join((s[:place],new,s[place+len(old):])) 
    except ValueError: 
     return s 
Смежные вопросы