2010-09-09 5 views
17

Je souhaite remplacer les caractères à la fin d'une chaîne python. J'ai cette chaîne:Comment remplacer les caractères de la fin d'une chaîne?

s = "123123" 

Je veux remplacer la dernière 2 avec x. Supposons qu'il y ait une méthode appelée replace_last:

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

est-il une méthode intégrée ou facile à faire?

Répondre

26

C'est exactement ce que la fonction rpartition est utilisé pour:

rpartition (...) S.rpartition (PAMH) -> (tête, indép, queue)

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. 

j'ai écrit cette fonction montrant comment utiliser rpartition dans votre cas d'utilisation:

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 

Sortie:

1231x3 
1

Voici une solution basée sur une interprétation simpliste de votre question. Une meilleure réponse nécessitera plus d'informations.

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

Mise à jour

(Après avoir vu la question modifiée) une autre réponse très spécifique.

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

Update 2

Il est beaucoup mieux way to do this. Courtoisie @mizipzor.

+0

Très désolé, je vient de modifier ma question, la rendre plus claire. – Freewind

+0

merci tout de même :) – Freewind

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

Pour votre deuxième exemple

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

Quand le match est recherché à la fin de la chaîne, re.sub vient à la rescousse.

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

En utilisant des expressions régulières pour remplacer les mots à la fin de chaîne:

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

Prints:

1231penguins 

ou

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

Impressions:

penguins3123 
+0

Pour l'exemple donné dans la question: 'r = re.sub (r" 2 [^ 2] $ "," x ", s)' – Eric

5

Il s'agit de l'une des rares fonctions de chaîne qui n'a pas de version gauche et droite, mais nous pouvons imiter le comportement en utilisant certaines des fonctions de chaîne qui le font.

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

ou

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

+1: En plus d'être plus court que la solution acceptée, cette solution a l'avantage que l'on peut faire autant de remplacements de droite que l'on veut, juste en changeant la valeur du second paramètre dans 'rsplit()'. C'était un avantage pour moi quand je suis allé chercher une solution à ce problème parce que j'aurais autrement dû utiliser une boucle pour faire plusieurs remplacements. – Simon

Questions connexes