2010-09-09 7 views
17

Я хочу заменить символы в конце строки python. У меня есть эта строка:Как заменить некоторые символы с конца строки?

s = "123123" 

Я хочу, чтобы заменить последний 2 с x. Предположим, что существует метод, называемый replace_last:

r = replace_last(s, '2', 'x') 
print r 
1231x3 

Есть ли встроенный или простой способ сделать это?

ответ

26

Это именно то, что функция rpartition используется для:

rpartition (...) С.rpartition (сентябрь) -> (голова, Сентябрь, хвост)

Search for the separator sep in S, starting at the end of S, and return 
the part before it, the separator itself, and the part after it. If the 
separator is not found, return two empty strings and S. 

Я написал эту функцию, показывающую, как использовать rpartition в вашем случае использования:

def replace_last(source_string, replace_what, replace_with): 
    head, _sep, tail = source_string.rpartition(replace_what) 
    return head + replace_with + tail 

s = "123123" 
r = replace_last(s, '2', 'x') 
print r 

Выход:

1231x3 
1

Это решение основано на упрощенной интерпретации вашего вопроса. Для лучшего ответа потребуется дополнительная информация.

>>> s = "aaa bbb aaa bbb" 
>>> separator = " " 
>>> parts = s.split(separator) 
>>> separator.join(parts[:-1] + ["xxx"]) 
'aaa bbb aaa xxx' 

Update

(После просмотра редактируемого вопрос) еще один очень конкретный ответ.

>>> s = "123123" 
>>> separator = "2" 
>>> parts = s.split(separator) 
>>> separator.join(parts[:-1]) + "x" + parts[-1] 
'1231x3' 

Update 2

Существует гораздо лучше way to do this. Предоставлено @mizipzor.

+0

Очень жаль, я отредактировал мой вопрос, сделать его более четким. – Freewind

+0

спасибо все равно :) – Freewind

5
>>> s = "aaa bbb aaa bbb" 
>>> s[::-1].replace('bbb','xxx',1)[::-1] 
'aaa bbb aaa xxx' 

Для вашего второго примера

>>> s = "123123" 
>>> s[::-1].replace('2','x',1)[::-1] 
'1231x3' 
1

Когда разыскиваемый матча в конце строки, re.sub приходит на помощь.

>>> import re 
>>> s = "aaa bbb aaa bbb" 
>>> s 
'aaa bbb aaa bbb' 
>>> re.sub('bbb$', 'xxx', s) 
'aaa bbb aaa xxx' 
>>> 
16

Использование регулярных выражений для замены слов в конце строки:

import re 
s = "123123" 
s = re.sub('23$', 'penguins', s) 
print s 

распечаток:

1231penguins 

или

import re 
s = "123123" 
s = re.sub('^12', 'penguins', s) 
print s 

Печать:

penguins3123 
+0

Для примера, приведенного в вопросе: 'r = re.sub (r" 2 [^ 2] $ "," x ", s)' – Eric

5

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

>>> s = '123123' 
>>> t = s.rsplit('2', 1) 
>>> u = 'x'.join(t) 
>>> u 
'1231x3' 

или

>>> 'x'.join('123123'.rsplit('2', 1)) 
'1231x3' 
+2

+1: а также быть короче чем принятое решение, это решение имеет то преимущество, что можно сделать столько замен справа, как хотелось бы, просто изменив значение второго параметра в 'rsplit()'. Это было преимуществом для меня, когда я искал решение этой проблемы, потому что в противном случае мне пришлось бы использовать цикл, чтобы сделать несколько замен. – Simon

Смежные вопросы