Skip to content

Remplacer des chaînes de caractères en Python (replace, translate, re.sub, re.subn)

Cet article décrit comment remplacer des chaînes en Python.

  • Remplacez les sous-chaînes :replace()
    • Spécifiez le nombre maximal de remplacements :count
    • Remplacer plusieurs sous-chaînes différentes
    • Remplacer le caractère de nouvelle ligne
  • Remplacez plusieurs caractères différents :translate()
  • Remplacer par regex :re.sub(), re.subn()
    • Remplacer plusieurs sous-chaînes par la même chaîne
    • Remplacer en utilisant la pièce assortie
    • Obtenez le nombre de pièces remplacées


  • Remplacer par position : tranche

Vous pouvez également supprimer la sous-chaîne en la remplaçant par une chaîne vide  ».

Si vous souhaitez extraire une sous-chaîne d’une chaîne au lieu de la remplacer, consultez l’article suivant.

Remplacez les sous-chaînes :replace()

Utilisez replace() pour remplacer les sous-chaînes.

Spécifiez l’ancienne chaîne old pour le premier argument et la nouvelle chaîne new pour le deuxième argument.

s = 'one two one two one'

print(s.replace(' ', '-'))
# one-two-one-two-one

Spécifier la chaîne vide  » comme nouveau supprimera l’ancien.

print(s.replace(' ', ''))
# onetwoonetwoone

Spécifiez le nombre maximal de remplacements :count

Vous pouvez spécifier le nombre maximum de remplacements dans le troisième paramètre, count. Si count est donné, seules les premières occurrences de count sont remplacées.

print(s.replace('one', 'XXX'))
# XXX two XXX two XXX

print(s.replace('one', 'XXX', 2))
# XXX two XXX two one

Remplacer plusieurs sous-chaînes différentes

Lorsque vous remplacez plusieurs chaînes différentes par la même chaîne, utilisez l’expression régulière décrite plus loin.

Il n’existe aucune méthode pour remplacer plusieurs chaînes différentes par des chaînes différentes, mais vous pouvez appliquer replace() à plusieurs reprises.

print(s.replace('one', 'XXX').replace('two', 'YYY'))
# XXX YYY XXX YYY XXX

Il appelle simplement replace() dans l’ordre, donc si le premier nouveau contient l’ancien suivant, le premier nouveau est également remplacé. Il faut être prudent dans l’ordre.

print(s.replace('one', 'XtwoX').replace('two', 'YYY'))
# XYYYX YYY XYYYX YYY XYYYX

print(s.replace('two', 'YYY').replace('one', 'XtwoX'))
# XtwoX YYY XtwoX YYY XtwoX

Lors du remplacement de plusieurs caractères (une chaîne de longueur 1), vous pouvez utiliser la méthode translate() décrite ci-dessous.

Remplacer le caractère de nouvelle ligne

S’il n’y a qu’un seul type de caractère de saut de ligne, vous pouvez le spécifier comme premier argument de replace().

s_lines = 'onentwonthree'
print(s_lines)
# one
# two
# three

print(s_lines.replace('n', '-'))
# one-two-three

Soyez prudent si n (LF, utilisé dans les systèmes d’exploitation Unix, y compris Mac) et rn (CR + LF, utilisé dans les systèmes d’exploitation Windows) sont mélangés.

Puisque n est inclus dans rn, le résultat souhaité ne peut pas être obtenu en fonction de l’ordre. L’exemple suivant montre également le résultat de repr() qui affiche n et r sous forme de chaîne.

s_lines_multi = 'onentwornthree'
print(s_lines_multi)
# one
# two
# three

print(repr(s_lines_multi))
# 'onentwornthree'

print(s_lines_multi.replace('rn', '-').replace('n', '-'))
# one-two-three

print(repr(s_lines_multi.replace('rn', '-').replace('n', '-')))
# 'one-two-three'

print(s_lines_multi.replace('n', '-').replace('rn', '-'))
# -threeo

print(repr(s_lines_multi.replace('n', '-').replace('rn', '-')))
# 'one-twor-three'

Vous pouvez utiliser splitlines(), qui renvoie une liste divisée avec divers caractères de retour à la ligne, et join(), qui combine des listes avec des chaînes.

Cette méthode est sûre et recommandée, surtout si vous ne savez pas quels caractères de retour à la ligne sont inclus.

print(s_lines_multi.splitlines())
# ['one', 'two', 'three']

print('-'.join(s_lines_multi.splitlines()))
# one-two-three

Consultez les articles suivants pour d’autres opérations liées au fractionnement de chaînes et aux sauts de ligne.

Remplacez plusieurs caractères différents :translate()

Utilisez la méthode translate() pour remplacer plusieurs caractères différents.

Vous pouvez créer la table de traduction spécifiée dans translate() par str.maketrans().

Spécifiez un dictionnaire dont la clé est l’ancien caractère et dont la valeur est la nouvelle chaîne dans str.maketrans().

L’ancien caractère doit être un caractère (une chaîne de longueur 1). La nouvelle chaîne est une chaîne ou None, où None supprime les anciens caractères.

s = 'one two one two one'

print(s.translate(str.maketrans({'o': 'O', 't': 'T'})))
# One TwO One TwO One

print(s.translate(str.maketrans({'o': 'XXX', 't': None})))
# XXXne wXXX XXXne wXXX XXXne

str.maketrans() peut également prendre trois chaînes comme arguments au lieu d’un dictionnaire.

Le premier argument est une chaîne dans laquelle les anciens caractères sont concaténés, le second est une chaîne dans laquelle les nouveaux caractères sont concaténés et le troisième est une chaîne dans laquelle les caractères à supprimer sont concaténés.

print(s.translate(str.maketrans('ow', 'XY', 'n')))
# Xe tYX Xe tYX Xe

Dans ce cas, les longueurs des premier et deuxième arguments doivent correspondre.

# print(s.translate(str.maketrans('ow', 'XXY', 'n')))
# ValueError: the first two maketrans arguments must have equal length

Remplacer par regex :re.sub(), re.subn()

Si vous souhaitez remplacer une chaîne qui correspond à une expression régulière (regex) au lieu d’une correspondance parfaite, utilisez le sub() du module re.

Dans re.sub(), spécifiez un motif regex dans le premier argument, une nouvelle chaîne dans le second et une chaîne à traiter dans le troisième.

import re

s = 'aaa@xxx.com bbb@yyy.com ccc@zzz.com'

print(re.sub('[a-z]*@', 'ABC@', s))
# ABC@xxx.com ABC@yyy.com ABC@zzz.com

Comme avec replace(), vous pouvez spécifier le nombre maximum de remplacements dans le quatrième paramètre, count.

print(re.sub('[a-z]*@', 'ABC@', s, 2))
# ABC@xxx.com ABC@yyy.com ccc@zzz.com

Remplacer plusieurs sous-chaînes par la même chaîne

Les deux suivants sont utiles à retenir même si vous n’êtes pas familier avec la regex.

Entourez une chaîne de [] pour qu’elle corresponde à n’importe quel caractère unique qu’elle contient. Vous pouvez remplacer plusieurs caractères différents par la même chaîne.

print(re.sub('[xyz]', '1', s))
# aaa@111.com bbb@111.com ccc@111.com

Si les motifs sont délimités par |, cela correspond à n’importe quel motif. Bien sûr, il est possible d’utiliser des caractères spéciaux d’expression régulière pour chaque modèle, mais c’est OK même si la chaîne normale est spécifiée telle quelle. Vous pouvez remplacer plusieurs chaînes différentes par la même chaîne.

print(re.sub('aaa|bbb|ccc', 'ABC', s))
# ABC@xxx.com ABC@yyy.com ABC@zzz.com

Remplacer en utilisant la pièce assortie

Si une partie du modèle est entourée de (), vous pouvez utiliser une chaîne qui correspond à la partie entourée de () dans la nouvelle chaîne.

print(re.sub('([a-z]*)@', '\1-123@', s))
# aaa-123@xxx.com bbb-123@yyy.com ccc-123@zzz.com

print(re.sub('([a-z]*)@', r'1-123@', s))
# aaa-123@xxx.com bbb-123@yyy.com ccc-123@zzz.com

1 correspond à la partie qui correspond à (). S’il y a plusieurs (), utilisez-les comme 2, 3 … .

Il faut s’échapper comme \1 dans une chaîne normale ( » ou «  »), mais vous pouvez écrire 1 dans une chaîne brute (r » ou r » »).

Obtenez le nombre de pièces remplacées

re.subn() renvoie un tuple de la chaîne remplacée et le nombre de parties remplacées.

t = re.subn('[a-z]*@', 'ABC@', s)
print(t)
# ('ABC@xxx.com ABC@yyy.com ABC@zzz.com', 3)

print(type(t))
# <class 'tuple'>

print(t[0])
# ABC@xxx.com ABC@yyy.com ABC@zzz.com

print(t[1])
# 3

Remplacer par position : tranche

Il n’existe aucune méthode pour remplacer la chaîne à la position spécifiée.

En divisant la chaîne avec une tranche et en les concaténant avec une autre chaîne, vous pouvez créer une nouvelle chaîne avec la position spécifiée remplacée.

s = 'abcdefghij'

print(s[:4] + 'XXX' + s[7:])
# abcdXXXhij

La longueur de la chaîne (nombre de caractères) peut être obtenue avec len(), elle peut donc s’écrire comme suit :

s_replace = 'XXX'
i = 4

print(s[:i] + s_replace + s[i + len(s_replace):])
# abcdXXXhij

Le nombre de caractères ne doit pas nécessairement correspondre, car il concatène simplement différentes chaînes entre les chaînes fractionnées.

print(s[:4] + '-' + s[7:])
# abcd-hij

Il est également possible de créer une nouvelle chaîne en insérant une autre chaîne n’importe où dans la chaîne.

print(s[:4] + '+++++' + s[4:])
# abcd+++++efghij

Consultez l’article suivant pour plus de détails sur le découpage.