Skip to content

Sostituire stringhe in Python (replace, translate, re.sub, re.subn)

Python

Questo articolo come sostituire le stringhe in Python.

  • Sostituisci le sottostringhe:replace()
    • Specificare il numero massimo di sostituzioni:count
    • Sostituisci più sottostringhe diverse
    • Sostituisci il carattere di nuova riga
  • Sostituisci più caratteri diversi:translate()
  • Sostituisci con regex:re.sub(), re.subn()
    • Sostituisci più sottostringhe con la stessa stringa
    • Sostituisci usando la parte abbinata
    • Ottieni il conteggio delle parti sostituite


  • Sostituisci con posizione: affettare

Puoi anche rimuovere la sottostringa sostituendola con una stringa vuota ”.

Se si desidera estrarre una sottostringa da una stringa invece di sostituirla, vedere l’articolo seguente.

Sostituisci le sottostringhe:replace()

Usa replace() per sostituire le sottostringhe.

Specificare la vecchia stringa vecchia per il primo argomento e la nuova stringa nuova per il secondo argomento.

s = 'one two one two one'

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

Specificando la stringa vuota ” come nuova eliminerà la vecchia.

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

Specificare il numero massimo di sostituzioni:count

È possibile specificare il numero massimo di sostituzioni nel terzo parametro, conte. Se viene fornito il conteggio, vengono sostituite solo le prime occorrenze di conteggio.

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

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

Sostituisci più sottostringhe diverse

Quando si sostituiscono stringhe diverse con la stessa più stringa, utilizzare l’espressione regolare descritta più avanti.

Non esiste un metodo per sostituire più stringhe diverse con stringhe diverse, ma puoi applicare sostituisci().

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

Chiama semplicemente replace() in ordine, quindi se il primo nuovo contiene il seguente vecchio, anche il primo nuovo viene sostituito. Devi stare attento in ordine.

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

Quando si sostituiscono più caratteri (una stringa di lunghezza 1), è possibile utilizzare il metodo translate() di seguito.

Sostituisci il carattere di nuova riga

Se c’è un solo tipo di carattere di nuova riga, puoi specificarlo come primo argomento di sostituire().

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

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

Fare attenzione se n (LF, utilizzatore nel sistema operativo Unix incluso Mac) e rn (CR + LF, utilizzatore nel sistema operativo Windows) sono mischiati.

Poiché n è incluso in rn, non è possibile ottenere il risultato desiderato a seconda dell’ordine. L’esempio seguente mostra anche il risultato di repr() che contiene ner come una stringa.

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'

Puoi usare splitlines(), che aggiunge una lista divisa con vari caratteri di nuova riga, e join(), che combina liste con stringhe.

In questo modo è sicuro e consigliato, soprattutto se non sai quali caratteri di nuova riga sono inclusi.

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

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

Vedere gli articoli seguenti per altre operazioni relative alla divisione delle stringhe e alle interruzioni di riga.

Sostituisci più caratteri diversi:translate()

Usa il metodo translate() per sostituire più caratteri.

Puoi creare la tabella di traduzione specificata in translate() da str.maketrans().

Specificare un dizionario la cui chiave è il vecchio carattere e il cui valore è la nuova stringa in str.maketrans().

Il vecchio carattere deve essere un carattere (una stringa di lunghezza 1). La nuova stringa è una stringa o None, dove None rimuove i vecchi caratteri.

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() può anche prendere tre stringhe come argomenti invece di un dizionario.

Il primo argomento è una stringa in cui vengono concatenati i vecchi caratteri, secondo il è una stringa in cui vengono concatenati i nuovi caratteri e il terzo è una stringa in cui vengono concatenati i caratteri da.

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

In questo caso, le lunghezze del primo e del secondo argomento devono corrispondere.

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

Sostituisci con regex:re.sub(), re.subn()

Se vuoi una stringa che corrisponde a un’espressione regolare (regex) invece di una corrispondenza perfetta, usa sub() del modulo re.

In re.sub(), specifica un modello regex nel primo argomento, una nuova stringa nel secondo e una stringa da elaborare nel terzo.

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

Come con replace(), puoi specificare il numero massimo di sostituzioni nel quarto parametro, count.

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

Sostituisci più sottostringhe con la stessa stringa

I due seguenti sono utili da ricordare anche se non hai familiarità con la regex.

Racchiudi una stringa con [] in qualsiasi modo che corrisponda a singolo carattere in esso contenuto. Puoi sostituire più caratteri con la stessa stringa.

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

Se i modelli sono delimitati da |, corrispondono a qualsiasi modello. Naturalmente, è possibile utilizzare caratteri speciali di regolare per ogni modello, ma va bene anche se la stringa normale è specificata così com’è. È possibile più stringhe diverse con la stessa stringa.

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

Sostituisci usando la parte abbinata

Se parte del motivo è racchiusa tra (), puoi utilizzare una stringa che corrisponda alla parte racchiusa tra () nella nuova stringa.

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 corrisponde alla parte che corrisponde a (). Se ce ne sono più (), usali come 2, 3 … .

È necessario eseguire l’escape come \1 in una stringa normale (” o “”), ma puoi scrivere 1 in una stringa grezza (r” o r””).

Ottieni il conteggio delle parti sostituite

re.subn() restituisce una tupla della stringa sostituita e il numero di parti sostituite.

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

Sostituisci con posizione: affettare

Non esiste un metodo per sostituire la stringa nella posizione specificata.

Dividendo la stringa con una fetta e concatenandola con un’altra stringa, puoi una nuova stringa con la creazione posizione specificata sostituita.

s = 'abcdefghij'

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

La lunghezza della stringa (numero di caratteri) può essere ottenuto con len(), quindi può essere scritta come segue:

s_replace = 'XXX'
i = 4

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

Il numero di caratteri non deve corrispondere, poiché concatena semplicemente stringhe diverse tra le stringhe divise.

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

È anche possibile creare una nuova stringa inserendo un’altra stringa in un punto della stringa.

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

Vedere il seguente articolo per i dettagli sull’affettatura.