Sto cercando di rimuovere caratteri specifici da una stringa usando Python. Questo è il codice che sto usando ora. Purtroppo sembra non fare nulla alla stringa.
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
Come faccio a farlo correttamente?
Le stringhe in Python sono immutabili (non possono essere cambiate). Per questo motivo, l'effetto di line.replace(...)
è solo quello di creare una nuova stringa, piuttosto che cambiare quella vecchia. Dovete rebind (assegnare) a line
per fare in modo che quella variabile prenda il nuovo valore, con quei caratteri rimossi.
Inoltre, il modo in cui lo stai facendo sarà piuttosto lento, relativamente. È anche probabile che sia un po' confuso per i pythonisti esperti, che vedranno una struttura doppiamente annidata e penseranno per un momento che sta succedendo qualcosa di più complicato.
A partire da Python 2.6 e versioni più recenti di Python 2.x *, potete invece usare str.translate
, (ma continuate a leggere per le differenze di Python 3):
line = line.translate(None, '!@#$')
o la sostituzione dell'espressione regolare con re.sub
import re
line = re.sub('[!@#$]', '', line)
I caratteri racchiusi tra parentesi costituiscono una classe di caratteri. Tutti i caratteri in line
che sono in quella classe sono sostituiti con il secondo parametro di sub
: una stringa vuota.
In Python 3, le stringhe sono Unicode. Dovrete tradurre un po' diversamente. kevpie lo menziona in un commento su una delle risposte, ed è notato nella documentazione per str.translate
.
Quando si chiama il metodo translate
di una stringa Unicode, non si può passare il secondo parametro che abbiamo usato sopra. Non puoi nemmeno passare None
come primo parametro, o anche una tabella di traduzione da string.maketrans
. Invece, si passa un dizionario come unico parametro. Questo dizionario mappa i valori ordinali dei caratteri (cioè il risultato della chiamata a ord
su di essi) ai valori ordinali dei caratteri che dovrebbero sostituirli, o - utile per noi - None
per indicare che dovrebbero essere cancellati.
Quindi, per fare il balletto di cui sopra con una stringa Unicode dovreste chiamare qualcosa come
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)
Qui dict.fromkeys
e map
sono usati per generare succintamente un dizionario contenente
{ord('!'): None, ord('@'): None, ...}
Ancora più semplice, come dice un'altra risposta, creare il dizionario sul posto:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
* Per compatibilità con i Python precedenti, si può creare una tabella di traduzione "null" da passare al posto di None
:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
Qui string.maketrans
è usato per creare una tabella di traduzione, che è solo una stringa contenente i caratteri con valori ordinali da 0 a 255.