Reemplazar las apariciones de una subcadena en una cadena con Python

    Introducción

    Reemplazar todas o n ocurrencias de una subcadena en una cadena dada es un problema bastante común de manipulación de cadenas y procesamiento de texto en general. Afortunadamente, la mayoría de estas tareas se facilitan en Python gracias a su amplia gama de funciones integradas, incluida esta.

    Digamos que tenemos una cadena que contiene la siguiente oración:

    The brown-eyed man drives a brown car.
    

    Nuestro objetivo es reemplazar la palabra "brown" con la palabra "blue":

    The blue-eyed man drives a blue car.
    

    En este artículo, usaremos el replace() función así como el sub() y subn() funciones con patrones para reemplazar todas las apariciones de una subcadena de una cadena.

    reemplazar()

    La forma más sencilla de hacer esto es usando la función incorporada – replace() :

    string.replace(oldStr, newStr, count)
    

    Los dos primeros parámetros son obligatorios, mientras que el tercero es opcional. oldStr es la subcadena que queremos reemplazar con la newStr. Lo que vale la pena señalar es que la función devuelve una nueva cadena, con la transformación realizada, sin afectar a la original.

    Hagamos un intento:

    string_a = "The brown-eyed man drives a brown car."
    string_b = string_a.replace("brown", "blue")
    print(string_a)
    print(string_b)
    

    Hemos realizado la operación en string_a, empaquetado el resultado en string_b e imprimí ambos.

    Este código da como resultado:

    The brown-eyed man drives a brown car.
    The blue-eyed man drives a blue car.
    

    De nuevo, la cadena en la memoria que string_a apunta a que permanece sin cambios. Las cadenas en Python son inmutables, lo que simplemente significa que no puede cambiar una cadena. Sin embargo, puede reasignar la variable de referencia a un nuevo valor.

    Para realizar aparentemente esta operación en el lugar, simplemente podemos reasignar string_a a sí mismo después de la operación:

    string_a = string_a.replace("brown", "blue")
    print(string_a)
    

    Aquí, la nueva cadena generada por el replace() El método se asigna al string_a variable.

    Reemplazar n apariciones de una subcadena

    Ahora, ¿qué pasa si no deseamos cambiar todas las apariciones de una subcadena? ¿Qué pasa si queremos reemplazar la primera n?

    Ahí es donde el tercer parámetro de la replace() entra la función. Representa el número de subcadenas que se van a reemplazar. El siguiente código solo reemplaza la primera aparición de la palabra "brown" con la palabra "blue":

    string_a = "The brown-eyed man drives a brown car."
    string_a = string_a.replace("brown", "blue", 1)
    print(string_a)
    

    Y esto imprime:

    The blue-eyed man drives a brown car.
    

    De forma predeterminada, el tercer parámetro está configurado para cambiar todas las ocurrencias.

    Ocurrencias de subcadenas con expresiones regulares

    Para escalar el problema aún más, digamos que queremos no solo reemplazar todas las ocurrencias de una determinada subcadena, sino también reemplazar todas las subcadenas que se ajustan a un determinado patrón. Incluso esto se puede hacer con una sola línea, usando expresiones regulares y la biblioteca estándar re módulo.

    Las expresiones regulares son un tema complejo con una amplia gama de usos en informática, por lo que no profundizaremos demasiado en este artículo, pero si necesita un comienzo rápido, puede consultar nuestra guía sobre Expresiones regulares en Python.

    En esencia, una expresión regular define un patrón. Por ejemplo, digamos que tenemos un texto sobre personas que tienen perros y gatos, y queremos cambiar ambos términos con la palabra "pet". Primero, necesitamos definir un patrón que coincida con ambos términos como – (cat|dog).

    Uso de la función sub ()

    Con el patrón resuelto, usaremos el re.sub() función que tiene la siguiente sintaxis:

    re.sub(pattern, repl, string, count, flags)
    

    El primer argumento es el patrón que estamos buscando (una cadena o un Pattern objeto), repl es lo que vamos a insertar (puede ser una cadena o una función; si es una cadena, cualquier escape de barra invertida se procesa) y string es la cadena en la que estamos buscando.

    Los argumentos opcionales son count y flags que indican cuántas ocurrencias deben reemplazarse y los indicadores utilizados para procesar la expresión regular, respectivamente.

    Si el patrón no coincide con ninguna subcadena, la cadena original se devolverá sin cambios:

    import re
    string_a = re.sub(r'(cat|dog)', 'pet', "Mark owns a dog and Mary owns a cat.")
    print(string_a)
    

    Este código imprime:

    Mark owns a pet and Mary owns a pet.
    

    Coincidencia de patrones que no distingue entre mayúsculas y minúsculas

    Para realizar una coincidencia de patrones que no distingue entre mayúsculas y minúsculas, por ejemplo, estableceremos el parámetro de marca en re.IGNORECASE:

    import re
    string_a = re.sub(r'(cats|dogs)', "Pets", "DoGs are a man's best friend", flags=re.IGNORECASE)
    print(string_a)
    

    Ahora cualquier combinación de caso de "dogs" también se incluirá. Al hacer coincidir el patrón con varias cadenas, para evitar copiarlo en varios lugares, podemos definir un Pattern objeto. También tienen un sub() función con la sintaxis:

    Pattern.sub(repl, string, count)
    

    Usar objetos de patrón

    Definamos un Pattern para gatos y perros y compruebe un par de frases:

    import re
    pattern = re.compile(r'(Cats|Dogs)')
    string_a = pattern.sub("Pets", "Dogs are a man's best friend.")
    string_b = pattern.sub("Animals", "Cats enjoy sleeping.")
    print(string_a)
    print(string_b)
    

    Lo que nos da la salida:

    Pets are a man's best friend.
    Animals enjoy sleeping.
    

    La función subn ()

    También hay un subn() método con la sintaxis:

    re.subn(pattern, repl, string, count, flags)
    

    los subn() La función devuelve una tupla con la cadena y el número de coincidencias en la Cadena que hemos buscado:

    import re
    string_a = re.subn(r'(cats|dogs)', 'Pets', "DoGs are a mans best friend", flags=re.IGNORECASE)
    print(string_a)
    

    La tupla se ve así:

    ('Pets are a mans best friend', 1)
    

    UN Pattern el objeto contiene un similar subn() función:

    Pattern.subn(repl, string, count)
    

    Y se usa de una manera muy similar:

    import re
    pattern = re.compile(r'(Cats|Dogs)')
    string_a = pattern.subn("Pets", "Dogs are a man's best friend.")
    string_b = pattern.subn("Animals", "Cats enjoy sleeping.")
    print(string_a)
    print(string_b)
    

    Esto resulta en:

    ("Pets are a man's best friend.", 1)
    ('Animals enjoy sleeping.', 1)
    

    Conclusión

    Python ofrece funciones fáciles y sencillas para el manejo de cadenas. La forma más sencilla de reemplazar todas las apariciones de una subcadena dada en una cadena es usar el replace() función.

    Si es necesario, la biblioteca estándar re El módulo proporciona un conjunto de herramientas más diverso que se puede utilizar para problemas más específicos como encontrar patrones y búsquedas que no distinguen entre mayúsculas y minúsculas.

     

    Etiquetas:

    Deja una respuesta

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