Las cadenas en Python son inmutables (no se pueden cambiar). Debido a esto, el efecto de line.replace(...)
es simplemente crear una nueva cadena, en lugar de cambiar la antigua. Debe volver a vincularlo (asignarlo) line
para que esa variable tome el nuevo valor, con esos caracteres eliminados.
Además, la forma en que lo haga será un poco lenta, relativamente. También es probable que sea un poco confuso para los pitonadores experimentados, que verán una estructura doblemente anidada y pensarán por un momento que algo más complicado está sucediendo.
A partir de Python 2.6 y las versiones más recientes de Python 2.x *, puede usar str.translate
, (pero siga leyendo para conocer las diferencias de Python 3):
line = line.translate(None, '!@#$')
o reemplazo de expresión regular con re.sub
import re
line = re.sub('[!@#$]', '', line)
Los caracteres entre paréntesis constituyen una clase de caracteres . Cualquier carácter en el line
que se encuentre en esa clase se reemplaza con el segundo parámetro para sub
: una cadena vacía.
En Python 3, las cadenas son Unicode. Tendrás que traducir un poco diferente. kevpie menciona esto en un comentario sobre una de las respuestas, y está anotado en la documentación destr.translate
.
Al llamar al translate
método de una cadena Unicode, no puede pasar el segundo parámetro que usamos anteriormente. Tampoco puede pasar None
como primer parámetro. En cambio, pasa una tabla de traducción (generalmente un diccionario) como el único parámetro. Esta tabla asigna los valores ordinales de los caracteres (es decir, el resultado de invocarlos ord
) a los valores ordinales de los caracteres que deberían reemplazarlos o, útilmente para nosotros, None
para indicar que deberían eliminarse.
Entonces, para hacer el baile anterior con una cuerda Unicode, llamarías algo así como
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)
Aquí dict.fromkeys
y map
se utilizan para generar sucintamente un diccionario que contiene
{ord('!'): None, ord('@'): None, ...}
Aún más simple, como dice otra respuesta , cree la tabla de traducción en su lugar:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
O cree la misma tabla de traducción con str.maketrans
:
unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))
* para compatibilidad con Python anteriores, puede crear una tabla de traducción "nula" para pasarla en lugar de None
:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
Aquí string.maketrans
se utiliza para crear una tabla de traducción , que es solo una cadena que contiene los caracteres con valores ordinales de 0 a 255.
filter
función y una expresión lambda:filter(lambda ch: ch not in " ?.!/;:", line)
. Bastante conciso y eficiente también, creo. Por supuesto, devuelve una nueva cadena a la que deberá asignar un nombre.