Estoy tratando de eliminar caracteres específicos de una cadena usando Python. Este es el código que estoy usando en este momento. Desafortunadamente, parece no hacer nada a la cadena.
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
¿Cómo hago esto correctamente?
python
string
immutability
Matt Phillips
fuente
fuente
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.Respuestas:
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):o reemplazo de expresión regular con
re.sub
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 parasub
: 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 de
str.translate
.Al llamar al
translate
método de una cadena Unicode, no puede pasar el segundo parámetro que usamos anteriormente. Tampoco puede pasarNone
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 invocarlosord
) 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
Aquí
dict.fromkeys
ymap
se utilizan para generar sucintamente un diccionario que contieneAún más simple, como dice otra respuesta , cree la tabla de traducción en su lugar:
O cree la misma tabla de traducción con
str.maketrans
:* para compatibilidad con Python anteriores, puede crear una tabla de traducción "nula" para pasarla en lugar de
None
: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.fuente
line.translate
toma solo un argumento y la primera solución no funcionaráline.translate({ord(i):None for i in '!@#$'})
"'"
para el conjunto de caracteres.notes = notes.translate({ord(i):None for i in '\"\''})
unicode_line.translate(str.maketrans('', '', '!@#$'))
. Ounicode_line.translate(dict.fromkeys(map(ord, '!@#$')))
¿Me estoy perdiendo el punto aquí, o es solo lo siguiente:
Ponlo en un bucle:
fuente
for char in b: a=a.replace(char,"")
string=string.replace("1","")
en su lugar. Has dicho esto en la parte del bucle de tu ejemplo, pero la mayoría de las personas no leerán tanto en tu respuesta hasta que hayan tocado el código un poco primero para una pregunta tan simple.fuente
blacklist = set('?:!/;')
y luego''.join(c for c in line if c not in blacklist)
Fácil guisante con
re.sub
expresión regular a partir de Python 3.5Ejemplo
Explicación
En expresiones regulares (regex),
|
es un OR lógico y\
escapa a espacios y caracteres especiales que podrían ser comandos regex reales. Mientras quesub
significa sustitución, en este caso con la cadena vacía''
.fuente
Para el requisito inverso de permitir solo ciertos caracteres en una cadena, puede usar expresiones regulares con un operador de complemento establecido
[^ABCabc]
. Por ejemplo, para eliminar todo excepto las letras ascii, los dígitos y el guión:De la documentación de expresiones regulares de Python :
fuente
El autor de la pregunta casi lo tuvo. Como la mayoría de las cosas en Python, la respuesta es más simple de lo que piensas.
No tiene que hacer el bucle anidado if / for, pero SÍ debe verificar cada carácter individualmente.
fuente
fuente
fuente
Las cadenas son inmutables en Python. El
replace
método devuelve una nueva cadena después del reemplazo. Tratar:fuente
line
.Me sorprendió que nadie hubiera recomendado todavía usar la función de filtro incorporado .
Digamos que queremos filtrar todo lo que no sea un número. Usar el método de filtro incorporado "... es equivalente a la expresión del generador (elemento para elemento en iterable si función (elemento))" [ Python 3 Builtins: Filter ]
En Python 3 esto vuelve
Para obtener una cadena impresa,
No estoy seguro de cómo filtrar clasifica el en términos de eficiencia, pero es bueno saber cómo usarlo al hacer listas de comprensión y demás.
ACTUALIZAR
Lógicamente, dado que el filtro funciona, también podría usar la comprensión de la lista y, por lo que he leído, se supone que es más eficiente porque las lambdas son los administradores de fondos de cobertura de Wall Street del mundo de la función de programación. Otra ventaja es que es un trazador de líneas que no requiere ninguna importación. Por ejemplo, usando la misma cadena 's' definida anteriormente,
Eso es. El retorno será una cadena de todos los caracteres que son dígitos en la cadena original.
Si tiene una lista específica de caracteres aceptables / inaceptables, solo necesita ajustar la parte 'si' de la comprensión de la lista.
o alternativamente,
fuente
operator.contains
si está usando un delambda
todos modos.lambda x: operator.contains(intsList, x)
debe deletrearselambda x: x in intsList
, o si está tratando de obtener la verificación de nivel C,intsList.__contains__
(no,lambda
en absoluto) hará el truco.Usando
filter
, solo necesitarías una líneaEsto trata la cadena como un iterable y verifica cada carácter si
lambda
devuelveTrue
:fuente
Aquí hay algunas formas posibles de lograr esta tarea:
PD: En lugar de usar "?.! / ;:" los ejemplos usan las vocales ... y sí, "murcielago" es la palabra en español que dice murciélago ... palabra divertida ya que contiene todas las vocales :)
PS2: si está interesado en el rendimiento, puede medir estos intentos con un código simple como:
En mi caja obtendrías:
Entonces parece que intent4 es el más rápido para esta entrada en particular.
fuente
list
enattempt1
y la tupla puede reescribirse a"aeiou"
por el bien de la simplicidad (eliminación[
y]
se convertirá en en un generador sin crear una lista). Crea toneladas de cadenas intermedias desechablesattemt2
, usa múltiples aplicaciones de expresiones regulares en lasattempt3
que podría usarr'[aeiou]'
en una sola pasada. cada uno tiene defectos, es agradable ver diferentes formas de hacer las cosas, pero por favor, corríjalos como buenos intentos tambiénAquí está mi versión compatible con Python 2/3. Desde la API de traducción ha cambiado.
fuente
dict.fromkeys(map(ord, '!@#$'))
para crear el mapa.map
generalmente es menos legible que una lista / dict / set / generador de comprensión. Tanto es así que Guido quería eliminarlo del idioma . El usofromkeys
también es un poco inteligente y requiere una verificación de documentos.str.maketrans('', '', chars)
, que maneja laord
conversión y ladict
construcción de una sola vez (sin mencionar que es bastante más obvio en su intención, ya que está diseñado para emparejarsestr.translate
).fuente
'
como una cadena. docs.python.org/2/library/re.htmlQué tal esto:
fuente
También puede usar una función para sustituir diferentes tipos de expresión regular u otro patrón con el uso de una lista. Con eso, puedes mezclar expresiones regulares, clases de caracteres y patrones de texto realmente básicos. Es realmente útil cuando necesita sustituir muchos elementos como los HTML.
* NB: funciona con Python 3.x
En la función string_cleanup, toma su cadena xy su lista no deseada como argumentos. Para cada elemento de esa lista de elementos o patrón, si se necesita un sustituto, se realizará.
La salida:
fuente
Mi método que usaría probablemente no funcionaría tan eficientemente, pero es enormemente simple. Puedo eliminar varios caracteres en diferentes posiciones a la vez, usando el corte y el formateo. Aquí hay un ejemplo:
Esto dará como resultado 'eliminado' que contenga la palabra 'esto'.
El formateo puede ser muy útil para imprimir variables a la mitad de una cadena de impresión. Puede insertar cualquier tipo de datos usando un % seguido del tipo de datos de la variable; todos los tipos de datos pueden usar % s , y los flotantes (también conocidos como decimales) y los enteros pueden usar % d .
El corte se puede usar para un control complejo sobre las cadenas. Cuando pongo palabras [: 3] , me permite seleccionar todos los caracteres de la cadena desde el principio (los dos puntos están antes del número, esto significará 'desde el principio hasta') hasta el cuarto carácter (incluye el cuarto personaje). La razón por la que 3 es igual hasta la cuarta posición es porque Python comienza en 0. Luego, cuando pongo la palabra [-1:] , significa el segundo último carácter hasta el final (los dos puntos están detrás del número). Poner -1 hará que Python cuente desde el último personaje, en lugar del primero. Nuevamente, Python comenzará en 0. Entonces, la palabra [-1:] básicamente significa 'desde el segundo último carácter hasta el final de la cadena.
Entonces, cortando los caracteres antes del carácter que quiero eliminar y los caracteres después y emparejándolos, puedo eliminar el carácter no deseado. Piensa en ello como una salchicha. En el medio está sucio, así que quiero deshacerme de él. Simplemente corté los dos extremos que quiero y luego los uní sin la parte no deseada en el medio.
Si quiero eliminar varios caracteres consecutivos, simplemente cambio los números en [] (parte de división). O si quiero eliminar varios caracteres de diferentes posiciones, simplemente puedo emparejar varias rebanadas a la vez.
Ejemplos:
eliminado es igual a 'genial'.
eliminado es igual a 'macs'.
En este caso, [3: 5] significa carácter en la posición 3 a través del carácter en la posición 5 (excluyendo el carácter en la posición final).
Recuerde, Python comienza a contar en 0 , por lo que también deberá hacerlo.
fuente
Prueba este:
Este método funciona bien en python 3.5.2
fuente
Puede usar el reemplazo de expresión regular del módulo re. El uso de la expresión ^ le permite elegir exactamente lo que desea de su cadena.
La salida a esto sería "Thisisabsurd". Solo aparecerán las cosas especificadas después del símbolo ^.
fuente
El método de cadena
replace
no modifica la cadena original. Deja el original solo y devuelve una copia modificada.Lo que quieres es algo como:
line = line.replace(char,'')
Sin embargo, crear una nueva cadena cada vez que se elimina un carácter es muy ineficiente. Recomiendo lo siguiente en su lugar:
fuente
Debajo de uno ... sin usar el concepto de expresión regular ...
fuente
En Python 3.5
p.ej,
Para eliminar todo el número de la cadena
fuente
puedes usar set
fuente
División recursiva: s = cadena; caracteres = caracteres para eliminar
ejemplo:
fuente
# para cada archivo en un directorio, cambie el nombre del archivo
fuente
Incluso el siguiente enfoque funciona
salida:
abcde
fuente
fuente