33- 馃攳 RegEx en Python: Gu铆a B谩sica para Principiantes




Python RegEx

馃攳 Python RegEx: Introducci贸n a las Expresiones Regulares

Las expresiones regulares (RegEx) son una secuencia de caracteres que forman un patr贸n de b煤squeda. Se utilizan para buscar, hacer coincidir y manipular texto basado en patrones espec铆ficos. Python tiene un m贸dulo incorporado llamado re que permite trabajar con expresiones regulares.

Con RegEx, puedes realizar tareas como:

  • Verificar si una cadena contiene un patr贸n espec铆fico.
  • Extraer todas las ocurrencias de un patr贸n en una cadena.
  • Reemplazar las ocurrencias de un patr贸n con otra cadena.
  • Dividir una cadena en subcadenas basadas en un patr贸n.

Las expresiones regulares son incre铆blemente poderosas y se utilizan en una amplia variedad de aplicaciones, desde la validaci贸n de datos hasta el procesamiento de texto complejo. Por ejemplo, podr铆as usar RegEx para:

  • Validar formatos de correo electr贸nico.
  • Extraer n煤meros de tel茅fono de un documento.
  • Buscar todas las menciones de una palabra clave en un texto.
  • Reemplazar todas las instancias de una palabra por otra.

En los siguientes temas, exploraremos c贸mo utilizar el m贸dulo re de Python y los diferentes componentes de las expresiones regulares.

RegEx Module

⚙️ El M贸dulo re: Tu Caja de Herramientas para RegEx

Como mencionamos anteriormente, Python incluye un m贸dulo llamado re que proporciona las herramientas necesarias para trabajar con expresiones regulares. Para empezar a usarlo, simplemente necesitas importarlo al inicio de tu script:

      
import re
      
     

Una vez importado, el m贸dulo re pone a tu disposici贸n una serie de funciones poderosas para realizar diversas operaciones con expresiones regulares. Estas funciones te permiten desde buscar patrones espec铆ficos en cadenas de texto hasta realizar reemplazos complejos y dividir cadenas basadas en criterios definidos por tus patrones RegEx.

En los siguientes temas, exploraremos en detalle algunas de las funciones m谩s importantes del m贸dulo re y c贸mo utilizarlas eficazmente.

RegEx in Python

馃悕 RegEx en Python: Primeros Pasos

Trabajar con expresiones regulares en Python generalmente sigue un patr贸n sencillo:

  1. Importar el m贸dulo re: Ya lo vimos, es el primer paso para acceder a las funcionalidades de RegEx.
  2. Definir el patr贸n: El coraz贸n de una expresi贸n regular es el patr贸n que defines. Este patr贸n es una cadena de texto con una sintaxis especial que describe lo que est谩s buscando.
  3. Usar una funci贸n del m贸dulo re: El m贸dulo re ofrece varias funciones para aplicar tu patr贸n a una cadena de texto. Las m谩s comunes son search(), findall(), match(), split() y sub().
  4. Analizar el resultado: La funci贸n que uses devolver谩 un resultado, que puede ser un objeto de coincidencia (si se encontr贸 el patr贸n), una lista de cadenas (con todas las coincidencias), o la cadena modificada (despu茅s de un reemplazo o divisi贸n).

Por ejemplo, si quisi茅ramos buscar la primera aparici贸n de la palabra "Python" en una cadena, podr铆amos hacer lo siguiente:

      
import re

texto = "Python es un lenguaje de programaci贸n popular. Aprendiendo Python."
patron = "Python"

resultado = re.search(patron, texto)

if resultado:
    print("¡Se encontr贸 'Python'!")
    print("Posici贸n:", resultado.start())
else:
    print("No se encontr贸 'Python'.")
      
     

En los pr贸ximos temas, profundizaremos en la creaci贸n de patrones m谩s complejos y el uso de las diferentes funciones del m贸dulo re.

RegEx Functions

馃洜️ Funciones Esenciales del M贸dulo re

El m贸dulo re nos brinda un conjunto de funciones poderosas para trabajar con expresiones regulares. Cada funci贸n est谩 dise帽ada para un prop贸sito espec铆fico en la b煤squeda y manipulaci贸n de texto.

  • search()

    Busca la primera ocurrencia del patr贸n en la cadena. Si la encuentra, devuelve un objeto de coincidencia; de lo contrario, devuelve None.

            
    import re
    
    texto = "La lluvia en Sevilla es una maravilla."
    patron = "Sevilla"
    resultado = re.search(patron, texto)
    
    if resultado:
        print(f"Se encontr贸 '{patron}' en la posici贸n: {resultado.start()}")
    else:
        print(f"No se encontr贸 '{patron}'.")
            
           
  • findall()

    Devuelve una lista con todas las coincidencias no superpuestas del patr贸n en la cadena. Si no hay coincidencias, devuelve una lista vac铆a.

            
    import re
    
    texto = "Manzana, banana, manzana, cereza."
    patron = "manzana"
    resultados = re.findall(patron, texto, re.IGNORECASE)
    print(f"Se encontraron: {resultados}")
            
           
  • match()

    Intenta hacer coincidir el patr贸n al inicio de la cadena. Si la coincidencia tiene 茅xito, devuelve un objeto de coincidencia; de lo contrario, devuelve None. Solo busca al principio de la cadena.

            
    import re
    
    texto = "Hola mundo"
    patron = "Hola"
    resultado = re.match(patron, texto)
    
    if resultado:
        print(f"Coincidencia al inicio: {resultado.group()}")
    else:
        print("No hay coincidencia al inicio.")
            
           
  • split()

    Divide la cadena en una lista de subcadenas, utilizando el patr贸n como delimitador.

            
    import re
    
    texto = "uno,dos,tres,cuatro"
    patron = ","
    resultados = re.split(patron, texto)
    print(f"Cadena dividida: {resultados}")
            
           
  • sub()

    Reemplaza todas las ocurrencias del patr贸n en la cadena con una cadena de reemplazo.

            
    import re
    
    texto = "Reemplazar los espacios con guiones bajos."
    patron = r"\s+"
    reemplazo = "_"
    nueva_cadena = re.sub(patron, reemplazo, texto)
    print(f"Cadena modificada: {nueva_cadena}")
            
           

Estas funciones son la base para realizar operaciones complejas de b煤squeda y manipulaci贸n de texto con expresiones regulares en Python. En los siguientes temas, exploraremos c贸mo construir patrones efectivos utilizando metacaracteres y secuencias especiales.

Metacharacters

✨ Metacaracteres: Los Ladrillos de tus Patrones RegEx

Los metacaracteres son caracteres especiales que tienen un significado predefinido en las expresiones regulares. En lugar de coincidir consigo mismos, controlan c贸mo se interpretan los patrones. Dominar los metacaracteres es crucial para construir expresiones regulares precisas y efectivas.

Aqu铆 tienes una descripci贸n detallada de algunos de los metacaracteres m谩s comunes:

  • [] (Conjunto de caracteres)

    Se utiliza para definir un conjunto de caracteres que deseas coincidir. Por ejemplo:

    • [aeiou] coincide con cualquier vocal min煤scula.
    • [0-9] coincide con cualquier d铆gito del 0 al 9.
    • [a-zA-Z] coincide con cualquier letra may煤scula o min煤scula.
    • [^0-9] coincide con cualquier car谩cter que NO sea un d铆gito (el ^ al principio niega el conjunto).
  • . (Cualquier car谩cter)

    El punto coincide con cualquier car谩cter individual, excepto el car谩cter de nueva l铆nea (\n) por defecto. Si quieres que coincida con la nueva l铆nea tambi茅n, puedes usar el flag re.DOTALL (o re.S).

  • ^ (Comienzo de la cadena)

    Se utiliza para asegurar que la coincidencia ocurra al principio de la cadena.

  • $ (Fin de la cadena)

    Se utiliza para asegurar que la coincidencia ocurra al final de la cadena.

  • * (Cero o m谩s ocurrencias)

    El asterisco despu茅s de un car谩cter (o un grupo) significa que ese car谩cter puede aparecer cero o m谩s veces.

  • + (Una o m谩s ocurrencias)

    El signo m谩s despu茅s de un car谩cter (o un grupo) significa que ese car谩cter debe aparecer una o m谩s veces.

  • ? (Cero o una ocurrencia)

    El signo de interrogaci贸n despu茅s de un car谩cter (o un grupo) significa que ese car谩cter puede aparecer cero o una vez.

  • {} (N煤mero espec铆fico de ocurrencias)

    Las llaves se utilizan para especificar el n煤mero exacto de veces que un car谩cter (o grupo) debe aparecer:

    • {n}: Exactamente n ocurrencias.
    • {n,}: n o m谩s ocurrencias.
    • {n,m}: Entre n y m ocurrencias (ambos inclusive).
  • | (Alternancia - OR l贸gico)

    La barra vertical se utiliza para especificar una de varias opciones. Por ejemplo, gato|perro coincide con "gato" o "perro".

  • () (Grupo de captura)

    Los par茅ntesis se utilizan para agrupar una parte del patr贸n. Esto permite aplicar cuantificadores a un grupo completo y tambi茅n capturar la parte de la cadena que coincide con el grupo para su posterior uso.

  • \ (Barra invertida - Escape)

    La barra invertida se utiliza para "escapar" metacaracteres si quieres que coincidan literalmente. Por ejemplo, para buscar un punto literal, usar铆as \.. Tambi茅n se utiliza para crear secuencias especiales (que veremos en el siguiente tema).

Comprender c贸mo funcionan estos metacaracteres te permitir谩 construir patrones de b煤squeda muy precisos y poderosos.

Flags

馃毄 Flags: Modificando el Comportamiento de tus RegEx

Las flags, tambi茅n conocidas como modificadores, son par谩metros opcionales que puedes pasar a las funciones del m贸dulo re para personalizar la forma en que se realizan las b煤squedas de patrones. Estas flags pueden hacer que las coincidencias sean insensibles a may煤sculas y min煤sculas, afectar c贸mo se interpretan los metacaracteres y mucho m谩s.

Aqu铆 tienes algunas de las flags m谩s utilizadas en Python:

  • re.IGNORECASE o re.I

    Esta flag hace que la coincidencia del patr贸n no distinga entre may煤sculas y min煤sculas. Por ejemplo, el patr贸n "python" coincidir谩 con "Python", "PYTHON" y "python" si se usa esta flag.

            
    import re
    
    texto = "Python es diferente de PYTHON."
    patron = "python"
    resultado1 = re.search(patron, texto)
    resultado2 = re.search(patron, texto, re.IGNORECASE)
    
    print(f"Sin flag: {resultado1}")
    print(f"Con flag re.IGNORECASE: {resultado2}")
            
           
  • re.DOTALL o re.S

    Por defecto, el metacaracter . coincide con cualquier car谩cter excepto la nueva l铆nea (\n). La flag re.DOTALL hace que . coincida con todos los caracteres, incluyendo la nueva l铆nea.

            
    import re
    
    texto = "primera l铆nea\nsegunda l铆nea"
    patron1 = r"."
    patron2 = r"."
    
    resultado1 = re.search(patron1, texto)
    resultado2 = re.search(patron2, texto, re.DOTALL)
    
    print(f"Sin flag (primer car谩cter): {resultado1.group()}")
    print(f"Con flag re.DOTALL (primer car谩cter): {resultado2.group()}")
            
           
  • re.MULTILINE o re.M

    En el modo multil铆nea, las anclas ^ y $ coinciden con el inicio y el final de cada l铆nea (no solo el inicio y el final de toda la cadena).

            
    import re
    
    texto = "l铆nea uno\nl铆nea dos\nl铆nea tres"
    patron1 = r"^l铆nea"
    patron2 = r"^l铆nea"
    
    resultado1 = re.findall(patron1, texto)
    resultado2 = re.findall(patron2, texto, re.MULTILINE)
    
    print(f"Sin flag re.MULTILINE: {resultado1}")
    print(f"Con flag re.MULTILINE: {resultado2}")
            
           
  • re.ASCII o re.A

    Hace que \w, \W, \b, \B, \s y \S realicen coincidencias basadas solo en el conjunto de caracteres ASCII.

  • re.DEBUG

    Muestra informaci贸n de depuraci贸n sobre el patr贸n compilado.

Puedes combinar varias flags utilizando el operador | (OR bit a bit). Por ejemplo, re.IGNORECASE | re.DOTALL.

El uso adecuado de las flags puede simplificar tus patrones de b煤squeda y hacerlos m谩s vers谩tiles.

Special Sequences

✨ Secuencias Especiales: Atajos para Patrones Comunes

Las secuencias especiales en RegEx son combinaciones de la barra invertida (`\`) seguida de otro car谩cter. Estas secuencias representan patrones comunes y hacen que nuestras expresiones regulares sean m谩s concisas y legibles.

Aqu铆 tienes algunas de las secuencias especiales m谩s 煤tiles:

  • \d

    Coincide con cualquier d铆gito decimal (0-9). Es equivalente a la clase de car谩cter [0-9].

            
    import re
    
    texto = "El a帽o es 2023."
    patron = r"\d{4}"
    resultado = re.search(patron, texto)
    
    if resultado:
        print(f"A帽o encontrado: {resultado.group()}")
            
           
  • \D

    Coincide con cualquier car谩cter que NO sea un d铆gito. Es equivalente a la clase de car谩cter [^0-9].

            
    import re
    
    texto = "C贸digo: ABC-123"
    patron = r"\D+"
    resultado = re.search(patron, texto)
    
    if resultado:
        print(f"Parte no num茅rica: {resultado.group()}")
            
           
  • \s

    Coincide con cualquier car谩cter de espacio en blanco (espacio, tabulador, nueva l铆nea, retorno de carro, avance de formulario, tabulador vertical).

            
    import re
    
    texto = "Palabra\tseparada\npor espacios."
    patron = r"\s+"
    resultados = re.split(patron, texto)
    print(f"Palabras: {resultados}")
            
           
  • \S

    Coincide con cualquier car谩cter que NO sea un espacio en blanco.

            
    import re
    
    texto = "Texto\tcon\nespacios."
    patron = r"\S+"
    resultados = re.findall(patron, texto)
    print(f"Elementos no espaciados: {resultados}")
            
           
  • \w

    Coincide con cualquier car谩cter alfanum茅rico (letras, n煤meros y el guion bajo). Es equivalente a [a-zA-Z0-9_].

            
    import re
    
    texto = "identificador_1 = 10"
    patron = r"\w+"
    resultados = re.findall(patron, texto)
    print(f"Elementos alfanum茅ricos: {resultados}")
            
           
  • \W

    Coincide con cualquier car谩cter que NO sea alfanum茅rico. Es equivalente a [^a-zA-Z0-9_].

            
    import re
    
    texto = "nombre!@dominio.com"
    patron = r"\W+"
    resultado = re.search(patron, texto)
    
    if resultado:
        print(f"Caracteres no alfanum茅ricos: {resultado.group()}")
            
           
  • \b

    Coincide con un l铆mite de palabra. Es la posici贸n entre una palabra y un car谩cter que no es una palabra (como un espacio, una puntuaci贸n o el inicio/fin de la cadena).

            
    import re
    
    texto = "El gato come pescado."
    patron1 = r"\bgato\b"  # Coincide con la palabra "gato" completa
    patron2 = r"gato\b"   # Coincide con "gato" al final de una palabra
    
    resultado1 = re.search(patron1, texto)
    resultado2 = re.search(patron2, texto)
    
    print(f"Coincidencia completa de 'gato': {resultado1}")
    print(f"Coincidencia de 'gato' al final: {resultado2}")
            
           
  • \B

    Coincide con una NO frontera de palabra.

  • \\

    Coincide con una barra invertida literal.

El uso inteligente de estas secuencias especiales puede simplificar enormemente la creaci贸n de patrones de b煤squeda comunes.

Sets

⚙️ Sets: Definiendo Rangos de Caracteres

Un set en RegEx se define utilizando un par de corchetes []. Los caracteres dentro de los corchetes representan un conjunto de caracteres que deseas coincidir. El motor de RegEx intentar谩 encontrar CUALQUIER car谩cter que est茅 dentro de ese set en la posici贸n dada del patr贸n.

Aqu铆 exploramos diferentes formas de definir sets:

  • Caracteres individuales

    Puedes listar caracteres individuales dentro de los corchetes. Por ejemplo:

    • [abc]: Coincide con "a", "b" o "c".
    • [12345]: Coincide con cualquier d铆gito del 1 al 5.
            
    import re
    
    texto = "Texto con a, b y z."
    patron = r"[abz]"
    resultados = re.findall(patron, texto)
    print(f"Coincidencias: {resultados}")
            
           
  • Rangos de caracteres

    Para especificar un rango de caracteres de forma m谩s concisa, puedes usar un guion -. Por ejemplo:

    • [a-z]: Coincide con cualquier letra min煤scula de la "a" a la "z".
    • [A-Z]: Coincide con cualquier letra may煤scula de la "A" a la "Z".
    • [0-9]: Coincide con cualquier d铆gito del 0 al 9.
    • [a-zA-Z0-9]: Coincide con cualquier letra (may煤scula o min煤scula) o d铆gito.
            
    import re
    
    texto = "C贸digo: A1b2C3d4"
    patron = r"[A-Za-z0-9]"
    resultados = re.findall(patron, texto)
    print(f"Caracteres alfanum茅ricos: {resultados}")
            
           
  • Negaci贸n de sets

    Si el primer car谩cter dentro de los corchetes es un signo de intercalaci贸n ^, el set se niega. Esto significa que coincidir谩 con CUALQUIER car谩cter que NO est茅 dentro del set.

    • [^abc]: Coincide con cualquier car谩cter que no sea "a", "b" o "c".
    • [^0-9]: Coincide con cualquier car谩cter que no sea un d铆gito.
            
    import re
    
    texto = "S铆mbolos !@# en el texto."
    patron = r"[^a-zA-Z\s.]"  # Coincide con cualquier cosa que no sea letra, espacio o punto.
    resultados = re.findall(patron, texto)
    print(f"S铆mbolos encontrados: {resultados}")
            
           
  • Combinaci贸n de sets

    Puedes combinar diferentes sets dentro de un mismo par de corchetes.

    • [a-z0-9_]: Coincide con cualquier letra min煤scula, d铆gito o guion bajo (similar a \w en modo ASCII).

Los sets son una herramienta fundamental para definir patrones de b煤squeda flexibles y precisos, permiti茅ndote especificar conjuntos de caracteres de manera eficiente.

The findall() Function

馃帲 La Funci贸n findall(): Encontrando Todas las Coincidencias

La funci贸n findall() del m贸dulo re es una de las herramientas m谩s utilizadas cuando necesitas encontrar todas las ocurrencias de un patr贸n en una cadena de texto. A diferencia de search(), que solo devuelve la primera coincidencia, findall() devuelve una lista que contiene todas las coincidencias no superpuestas del patr贸n en la cadena.

La sintaxis b谩sica de findall() es:

      
re.findall(patr贸n, cadena, flags=0)
      
     

Donde:

  • patr贸n: Es la expresi贸n regular que deseas buscar.
  • cadena: Es la cadena en la que quieres realizar la b煤squeda.
  • flags (opcional): Son las flags que modifican el comportamiento de la b煤squeda (como re.IGNORECASE).

El valor de retorno de findall() es una lista de cadenas. Cada elemento de la lista es una de las coincidencias encontradas en la cadena.

Ejemplos de uso de findall()

  • Encontrar todas las palabras

            
    import re
    
    texto = "El perro corre y el gato tambi茅n corre."
    patron = r"\b\w+\b"  # Encuentra todas las palabras completas
    resultados = re.findall(patron, texto)
    print(f"Palabras encontradas: {resultados}")
            
           
  • Encontrar todos los n煤meros

            
    import re
    
    texto = "Los precios son: 10, 25.50 y 100."
    patron = r"\d+(\.\d+)?"  # Encuentra n煤meros enteros y decimales
    resultados = re.findall(patron, texto)
    print(f"N煤meros encontrados: {resultados}")
            
           
  • Encontrar todas las direcciones de correo electr贸nico (ejemplo simplificado)

            
    import re
    
    texto = "Contacta con nosotros en info@example.com o ventas@otroejemplo.net."
    patron = r"\b\w+@\w+\.\w+\b"
    resultados = re.findall(patron, texto)
    print(f"Correos electr贸nicos encontrados: {resultados}")
            
           

Es importante recordar que si el patr贸n contiene grupos de captura (definidos por par茅ntesis), findall() devolver谩 una lista de tuplas, donde cada tupla contiene las coincidencias de los grupos. Si no hay grupos de captura, devuelve una lista de las coincidencias completas.

      
import re

texto = "Fechas: 2023-10-26 y 2024-01-15."
patron = r"(\d{4})-(\d{2})-(\d{2})"  # Tres grupos de captura para a帽o, mes y d铆a
resultados = re.findall(patron, texto)
print(f"Fechas encontradas (grupos): {resultados}")
     
     

findall() es una herramienta poderosa para extraer informaci贸n espec铆fica de grandes cantidades de texto de manera eficiente.

The search() Function

馃攳 La Funci贸n search(): Buscando la Primera Coincidencia

La funci贸n search() del m贸dulo re busca la primera ubicaci贸n donde el patr贸n de expresi贸n regular produce una coincidencia en la cadena. A diferencia de findall(), que devuelve todas las coincidencias, search() se detiene en la primera que encuentra.

La sintaxis b谩sica de search() es:

      
re.search(patr贸n, cadena, flags=0)
      
     

Donde:

  • patr贸n: Es la expresi贸n regular que deseas buscar.
  • cadena: Es la cadena en la que quieres realizar la b煤squeda.
  • flags (opcional): Son las flags que modifican el comportamiento de la b煤squeda.

El valor de retorno de search() es un objeto de coincidencia (Match Object) si el patr贸n se encuentra en la cadena. Si el patr贸n no se encuentra, devuelve None.

Trabajando con el Objeto de Coincidencia

Cuando search() encuentra una coincidencia, devuelve un objeto que contiene informaci贸n sobre esa coincidencia, como:

  • La cadena original.
  • La posici贸n de inicio y fin de la coincidencia.
  • El grupo o grupos que coinciden con el patr贸n (si se usaron par茅ntesis).

Puedes acceder a esta informaci贸n utilizando m茅todos del objeto de coincidencia, como span(), start(), end() y group(). Exploraremos el objeto de coincidencia en detalle m谩s adelante.

Ejemplos de uso de search()

  • Buscar la primera palabra que empiece con "P"

            
    import re
    
    texto = "La primera palabra es Python."
    patron = r"\bP\w+"
    resultado = re.search(patron, texto)
    
    if resultado:
        print(f"Primera palabra con 'P' encontrada: {resultado.group()}")
        print(f"Posici贸n de inicio: {resultado.start()}")
        print(f"Posici贸n de fin: {resultado.end()}")
    else:
        print("No se encontr贸 ninguna palabra que empiece con 'P'.")
            
           
  • Verificar si una cadena contiene un n煤mero

            
    import re
    
    texto = "El c贸digo es ABC123XYZ."
    patron = r"\d+"
    resultado = re.search(patron, texto)
    
    if resultado:
        print("Se encontr贸 un n煤mero.")
        print(f"N煤mero encontrado: {resultado.group()}")
    else:
        print("No se encontr贸 ning煤n n煤mero.")
            
           
  • Buscar una fecha con un formato espec铆fico

            
    import re
    
    texto = "La fecha del evento es 2023-11-10."
    patron = r"\d{4}-\d{2}-\d{2}"
    resultado = re.search(patron, texto)
    
    if resultado:
        print(f"Fecha encontrada: {resultado.group()}")
    else:
        print("No se encontr贸 ninguna fecha con el formato YYYY-MM-DD.")
            
           

search() es ideal cuando solo necesitas encontrar la primera ocurrencia de un patr贸n y obtener informaci贸n sobre ella.

The split() Function

✂️ La Funci贸n split(): Dividiendo Cadenas con RegEx

La funci贸n split() del m贸dulo re divide una cadena en una lista de subcadenas, utilizando las ocurrencias del patr贸n como delimitadores. Es una forma poderosa y flexible de segmentar texto basado en criterios definidos por expresiones regulares.

La sintaxis b谩sica de split() es:

      
re.split(patr贸n, cadena, maxsplit=0, flags=0)
      
     

Donde:

  • patr贸n: Es la expresi贸n regular que se utilizar谩 como delimitador.
  • cadena: Es la cadena que se va a dividir.
  • maxsplit (opcional): Si se especifica, indica el n煤mero m谩ximo de divisiones que se realizar谩n. Si es 0 (o no se especifica), se realizar谩n todas las divisiones posibles.
  • flags (opcional): Son las flags que modifican el comportamiento de la b煤squeda del patr贸n.

El valor de retorno de split() es una lista de las subcadenas resultantes de la divisi贸n.

Ejemplos de uso de split()

  • Dividir una cadena por comas y espacios

            
    import re
    
    texto = "manzana, pera,  banana,uva"
    patron = r",\s*"  # Coincide con una coma seguida de cero o m谩s espacios
    resultados = re.split(patron, texto)
    print(f"Lista de frutas: {resultados}")
            
           
  • Dividir una cadena por n煤meros

            
    import re
    
    texto = "parte123parte456parte789"
    patron = r"\d+"
    resultados = re.split(patron, texto)
    print(f"Partes divididas por n煤meros: {resultados}")
            
           
  • Dividir una cadena por saltos de l铆nea (m谩ximo 2 divisiones)

            
    import re
    
    texto = "L铆nea 1\nL铆nea 2\nL铆nea 3\nL铆nea 4"
    patron = r"\n"
    resultados = re.split(patron, texto, maxsplit=2)
    print(f"Dividido por saltos de l铆nea (m谩ximo 2): {resultados}")
            
           

Es importante notar que si el patr贸n contiene grupos de captura, las cadenas que coinciden con los grupos tambi茅n se incluir谩n en la lista resultante, intercaladas con las subcadenas divididas.

      
import re

texto = "palabra1(separador)palabra2"
patron = r"(\(|\))"  # Coincide con par茅ntesis de apertura o cierre (y los captura)
resultados = re.split(patron, texto)
print(f"Dividido con captura de delimitadores: {resultados}")
     
     

La funci贸n split() ofrece una gran flexibilidad para segmentar texto de manera inteligente bas谩ndose en patrones complejos.

The sub() Function

馃攧 La Funci贸n sub(): Reemplazando Texto con RegEx

La funci贸n sub() del m贸dulo re permite reemplazar todas las ocurrencias de un patr贸n en una cadena con una nueva subcadena. Es una herramienta muy poderosa para realizar transformaciones de texto complejas.

La sintaxis b谩sica de sub() es:

      
re.sub(patr贸n, reemplazo, cadena, count=0, flags=0)
      
     

Donde:

  • patr贸n: Es la expresi贸n regular que se buscar谩 en la cadena.
  • reemplazo: Es la cadena con la que se reemplazar谩n las coincidencias del patr贸n. Tambi茅n puede ser una funci贸n (que recibe el objeto de coincidencia como argumento).
  • cadena: Es la cadena en la que se realizar谩n las sustituciones.
  • count (opcional): Especifica el n煤mero m谩ximo de reemplazos que se realizar谩n. Si es 0 (o no se especifica), se reemplazar谩n todas las ocurrencias.
  • flags (opcional): Son las flags que modifican el comportamiento de la b煤squeda del patr贸n.

El valor de retorno de sub() es la nueva cadena resultante despu茅s de realizar los reemplazos.

Ejemplos de uso de sub()

  • Reemplazar todos los espacios con guiones bajos

            
    import re
    
    texto = "Este es un texto con espacios."
    patron = r"\s+"
    reemplazo = "_"
    nueva_cadena = re.sub(patron, reemplazo, texto)
    print(f"Cadena modificada: {nueva_cadena}")
            
           
  • Eliminar todos los d铆gitos de una cadena

            
    import re
    
    texto = "Producto C贸digo: ABC-123-DEF-456"
    patron = r"\d+"
    reemplazo = ""
    nueva_cadena = re.sub(patron, reemplazo, texto)
    print(f"Cadena sin d铆gitos: {nueva_cadena}")
            
           
  • Reemplazar la primera ocurrencia de una palabra (con count=1)

            
    import re
    
    texto = "La casa azul tiene una puerta azul."
    patron = r"\bazul\b"
    reemplazo = "verde"
    nueva_cadena = re.sub(patron, reemplazo, texto, count=1)
    print(f"Cadena con el primer reemplazo: {nueva_cadena}")
            
           
  • Usando una funci贸n como reemplazo (para cambiar may煤sculas a min煤sculas)

            
    import re
    
    def minuscula(coincidencia):
        return coincidencia.group(0).lower()
    
    texto = "ALGUNAS PALABRAS EN MAY脷SCULAS."
    patron = r"[A-Z]+"
    nueva_cadena = re.sub(patron, minuscula, texto)
    print(f"Cadena en min煤sculas: {nueva_cadena}")
            
           

La funci贸n sub() es extremadamente vers谩til y permite realizar modificaciones de texto sofisticadas basadas en patrones definidos por expresiones regulares.

Match Object

馃摝 El Objeto de Coincidencia (Match Object)

Cuando utilizas funciones como re.search() o re.match() y se encuentra una coincidencia, estas funciones no devuelven directamente la cadena coincidente. En su lugar, devuelven un objeto llamado **Match Object**. Este objeto contiene informaci贸n detallada sobre la coincidencia, incluyendo la cadena coincidente en s铆, su ubicaci贸n dentro de la cadena original y cualquier grupo capturado por el patr贸n.

M茅todos del Objeto de Coincidencia

El objeto de coincidencia proporciona varios m茅todos 煤tiles para acceder a la informaci贸n de la coincidencia:

  • group()

    Devuelve la parte de la cadena donde hubo coincidencia. Si se proporcionan uno o m谩s argumentos (n煤meros de grupo), devuelve la subcadena (o tupla de subcadenas) coincidente con ese grupo.

            
    import re
    
    texto = "Nombre: Juan P茅rez, Edad: 30"
    patron = r"Nombre: (\w+) (\w+), Edad: (\d+)"
    resultado = re.search(patron, texto)
    
    if resultado:
        print(f"Coincidencia completa: {resultado.group()}")
        print(f"Nombre completo: {resultado.group(0)}") # Equivalente a group() sin argumentos
        print(f"Primer nombre (grupo 1): {resultado.group(1)}")
        print(f"Apellido (grupo 2): {resultado.group(2)}")
        print(f"Edad (grupo 3): {resultado.group(3)}")
        print(f"Todos los grupos: {resultado.groups()}") # Devuelve una tupla con todos los grupos
    else:
        print("No se encontr贸 coincidencia.")
            
           
  • start()

    Devuelve la posici贸n inicial de la coincidencia.

            
    import re
    
    texto = "El n煤mero 123 est谩 aqu铆."
    patron = r"\d+"
    resultado = re.search(patron, texto)
    
    if resultado:
        print(f"La coincidencia comienza en la posici贸n: {resultado.start()}")
            
           
  • end()

    Devuelve la posici贸n final de la coincidencia (el 铆ndice del car谩cter siguiente al 煤ltimo de la coincidencia).

            
    import re
    
    texto = "El n煤mero 123 est谩 aqu铆."
    patron = r"\d+"
    resultado = re.search(patron, texto)
    
    if resultado:
        print(f"La coincidencia termina en la posici贸n: {resultado.end()}")
            
           
  • span()

    Devuelve una tupla que contiene las posiciones inicial y final de la coincidencia: (start, end).

            
    import re
    
    texto = "El n煤mero 123 est谩 aqu铆."
    patron = r"\d+"
    resultado = re.search(patron, texto)
    
    if resultado:
        print(f"El rango de la coincidencia es: {resultado.span()}")
            
           

Comprender y utilizar los m茅todos del objeto de coincidencia te permite extraer informaci贸n espec铆fica y detallada sobre las partes de la cadena que coinciden con tu patr贸n de expresi贸n regular.




Publicar un comentario

0 Comentarios