Tutorial: Aprende a eliminar caracteres en una cadena de texto en Python

En esta guía, veremos cómo eliminar un carácter de una cadena en Python .

Las cadenas, y especialmente la entrada generada por el usuario, pueden contener caracteres no deseados, como caracteres especiales en un campo de nombre de usuario que no queremos almacenar. En esos casos, es posible que prefiramos eliminar caracteres específicos de una cadena determinada.

La forma más común de eliminar un carácter de una cadena es con el metodo replace(), pero también podemos utilizar el método translate() e incluso reemplazar una o más ocurrencias de un carácter dado.

Eliminar carácter en Python usando replace ()

La  clase string proporciona un método replace() que reemplaza un caracter por otro. Vale la pena señalar que su función devuelve una nueva cadena con los caracteres reemplazados, ya que las cadenas son inmutables . La cadena original permanece sin cambios, pero el objeto en la memoria se pierde a menos que mantengamos viva una referencia a él. Normalmente, asignará el valor devuelto al mismo puntero o uno nuevo.

El método reemplaza todas las apariciones de un carácter por uno nuevo. Por ejemplo, any_string.replace('a', 'b') reemplazará todas las apariciones de 'a' en  any_string con el carácter 'b'. Para eliminar un carácter de una cadena mediante replace(), lo reemplazaremos con un carácter vacío:

original_string = "Facialix"
<em># Removing character 'a' and replacing with an empty character</em>
new_string = original_string.replace('a', '')
print("String after removing the character 'a':", new_string)

Una vez que ejecutamos este código, somos recibidos con:

String after removing the character 'a': Fcilix

Eliminar carácter en Python usando translate ()

Las cadenas de Python tienen un método  translate() que reemplaza los caracteres con otros caracteres especificados en una tabla de traducción.

Una tabla de traducción es solo un diccionario de asignaciones de clave-valor donde cada clave se reemplazará con un valor.

Para que este método funcione, tenemos que especificar el valor Unicode para las cadenas, que podemos obtener a través de la funcion ord().

Por ejemplo, any_string.ranslate({ord('a'):ord('z'), ord('b'):ord('y')}) reemplazará las apariciones de 'a' con 'z''b' con 'y'.

Para eliminar un carácter de una cadena usando translate(), deberá asignar el valor Unicode del carácter Noneen la tabla de traducción:

original_string = "Facialix"
<em># removing character 'a'</em>
new_string = original_string.translate({ord('a'): None})
print("String after removing the character 'a':", new_string)

Este código da como resultado:

String after removing the character 'a': fcilix

Eliminar un número de apariciones de un caracter

Los métodos replace()translate() reemplazan todas las apariciones de un carácter dado por otro. Sin embargo, el método  replace() toma un argumento opcional count. Si se proporciona, count solo reemplaza el número de ocurrencias del carácter dado.

Intentemos eliminar solo el primero 'a'de la cadena, en lugar de todas las apariciones:

original_string = "Facialix"
<em># removing character 's'</em>
new_string = original_string.replace('a',  '', 1)
print("String after removing the character 'a':", new_string)

La salida del código anterior se verá así:

String after removing the character 'a': Fcialix

Como el recuento se establece en 1, solo 'a'se reemplaza la primera aparición de ; esto es útil cuando desea eliminar uno y solo un carácter.

Crear manualmente una nueva cadena sin un carácter

Una técnica algo esotérica, pero sencilla, sería crear una cadena vacía y recorrer la cadena original. En el ciclo, escribiremos todos los caracteres en la nueva cadena excepto el que se va a eliminar.

Esto es en realidad lo que sucede bajo el capó, con una validación adicional. Dado que Python está implementado en C, podemos observar el codigo fuente de stringobject.c , que define el metodo replace(), que en última instancia llama a replace_single_character()replace_single_character_in_place():

    start = self_s;
    end = self_s + self_len;
    while (count-- > 0) {
        next = findchar(start, end-start, from_c);
        if (next == NULL)
            break;

        if (next == start) {
            <em>/* replace with the 'to' */</em>
            Py_MEMCPY(result_s, to_s, to_len);
            result_s += to_len;
            start += 1;
        } else {
            <em>/* copy the unchanged old then the 'to' */</em>
            Py_MEMCPY(result_s, start, next-start);
            result_s += (next-start);
            Py_MEMCPY(result_s, to_s, to_len);
            result_s += to_len;
            start = next+1;
        }
    }
    <em>/* Copy the remainder of the remaining string */</em>
    Py_MEMCPY(result_s, start, end-start);

    return result;

Para obtener una apreciación de cuánta lógica se abstrae detrás de API simples, intuitivas y de alto nivel, podemos realizar este proceso manualmente:

def remove_character(original_string, character, occurrence_num):
    new_string = ""
    for char in original_string:
        if char == character and occurrence_num > 0:
            occurrence_num = occurrence_num-1
            continue
        else:
            new_string += char
    return new_string                
                
                
string = 'Facialix'
print(remove_character(string, 'a', 0))
print(remove_character(string, 'a', 1))
print(remove_character(string, 'a', 2))

El fragmento de código anterior producirá el siguiente resultado:

Facialix
Fcialix
Fcilix

Podemos ver que nuestro propio método funciona de la misma manera que el replace()método, pero es mucho menos eficiente:

print("Time taken by manual method: {}"
    .format(timeit.timeit("remove_character('stack abuse', 'a', 1)", "from __main__ import remove_character")))
    
print("Time taken by replace(): {}"
    .format(timeit.timeit("'stack abuse'.replace('a', '', 1)")))

El cronometraje de estos métodos da como resultado:

Time taken by manual method: 1.3785062030074187
Time taken by replace(): 0.13279212499037385

Conclusión

En este tutorial, exploramos cómo podemos eliminar caracteres de una cadena en Python. Hemos visto cómo usar los métodos replace()translate() para eliminar caracteres reemplazándolos con una cadena vacía o su Unicode con None.

Más tarde, hemos utilizado replace() para eliminar un número predefinido de apariciones del carácter dado, e incluso el buen for . El  método translate() es útil si tenemos que eliminar un conjunto de caracteres, ya que podemos darle una tabla de traducción. Y el mettódo replace() es útil si queremos eliminar una serie de apariciones de un carácter determinado.


También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.