Le stringhe in Python sono immutabili (non possono essere modificate). Per questo motivo, l'effetto di line.replace(...)
è solo quello di creare una nuova stringa, anziché cambiare quella vecchia. È necessario ricollegarlo (assegnarlo) a per fare line
in modo che quella variabile prenda il nuovo valore, con quei caratteri rimossi.
Inoltre, il modo in cui lo fai sarà un po 'lento, relativamente. È anche probabile che sia un po 'confuso per i pitoni 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 successive di Python 2.x *, puoi invece utilizzare str.translate
(ma continua a leggere per le differenze di Python 3):
line = line.translate(None, '!@#$')
o sostituzione di espressioni regolari con re.sub
import re
line = re.sub('[!@#$]', '', line)
I caratteri racchiusi tra parentesi costituiscono una classe di caratteri . Tutti i caratteri in line
quella classe vengono sostituiti con il secondo parametro in sub
: una stringa vuota.
In Python 3, le stringhe sono Unicode. Dovrai tradurre in modo leggermente diverso. kevpie menziona questo in un commento su una delle risposte, ed è annotato nella documentazione distr.translate
.
Quando si chiama il translate
metodo di una stringa Unicode, non è possibile passare il secondo parametro che abbiamo usato sopra. Inoltre, non puoi passare None
come primo parametro. Invece, si passa una tabella di traduzione (di solito un dizionario) come unico parametro. Questa tabella mappa i valori ordinali dei caratteri (cioè il risultato della ord
loro chiamata ) ai valori ordinali dei caratteri che dovrebbero sostituirli o - utilmente a noi - None
per indicare che dovrebbero essere eliminati.
Quindi per fare la danza sopra con una stringa Unicode chiameresti qualcosa del genere
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)
Qui dict.fromkeys
e map
vengono utilizzati per generare in modo succinto un dizionario contenente
{ord('!'): None, ord('@'): None, ...}
Ancora più semplice, come dice un'altra risposta , crea la tabella di traduzione in atto:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
Oppure crea la stessa tabella di traduzione con str.maketrans
:
unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))
* per compatibilità con Pythons precedenti, è possibile creare una tabella di traduzione "null" da passare al posto di None
:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
Qui string.maketrans
viene utilizzato per creare una tabella di traduzione , che è solo una stringa contenente i caratteri con valori ordinali da 0 a 255.
filter
funzione e un'espressione Lambda:filter(lambda ch: ch not in " ?.!/;:", line)
. Abbastanza conciso ed efficiente, penso. Ovviamente, restituisce una nuova stringa a cui dovrai assegnare un nome.