70. Expresiones regulares II

Vídeo

Notas personales

En esta lección, continuaremos el estudio de las expresiones regulares abordando los denominados metacaracteres (o caracteres comodín).

Empecemos con las anclas, que dentro de una lista nos van a permitir encontrar coincidencias al principio y al final de cada elemento de esta. Por ejemplo, mediante el ancla ^, las buscamos al inicio de la cadena de texto:

import re

lista_nombres = ["Ana Gómez",
                 "María Martín",
                 "Sandra López",
                 "Santiago Martín"]

for nombre in lista_nombres:
    if re.findall("^Sandra", nombre):
        print(nombre)
Sandra López

El último bucle lo podemos compactar utilizando comprensiones de listas de la siguiente forma:

[print(nombre) for nombre in lista_nombres if re.findall("^Sandra", nombre)]

Así, podemos extraer de lista_nombres, si nos interesa, todos los nombres que comiencen por S:

import re

lista_nombres = ["Ana Gómez",
                 "María Martín",
                 "Sandra López",
                 "Santiago Martín"]

[print(nombre) for nombre in lista_nombres if re.findall("^S", nombre)]
Sandra López
Santiago Martín

¿Y si queremos todos los nombres cuyo apellido sea Martín? El ancla $ es el metacarácter que hemos de emplear:

import re

lista_nombres = ["Ana Gómez",
                 "María Martín",
                 "Sandra López",
                 "Santiago Martín"]

[print(nombre) for nombre in lista_nombres if re.findall("Martín$", nombre)]
María Martín
Santiago Martín

Veamos otro ejemplo de su uso, trabajando ahora con una lista de dominios, estamos interesados en encontrar aquellos que acaben en .es:

import re

urls = ["https://pildorasinformaticas.es",
        "ftp://pildorasinformaticas.es",
        "https://pildorasinformaticas.com",
        "ftp://pildorasinformaticas.com"]

[print(url) for url in urls if re.findall(".es$", url)]
https://pildorasinformaticas.es
ftp://pildorasinformaticas.es

Quizá nos interese hallar qué dominios son de tipo ftp:

import re

urls = ["https://pildorasinformaticas.es",
        "ftp://pildorasinformaticas.es",
        "https://pildorasinformaticas.com",
        "ftp://pildorasinformaticas.com"]

[print(url) for url in urls if re.findall("^ftp", url)]
ftp://pildorasinformaticas.es
ftp://pildorasinformaticas.com

Por otro lado, tenemos las clases de caracteres, que nos permiten introducir patrones de búsqueda utilizando el operador []. Cambiemos ligeramente los dominios para ver su utilidad (buscando aquellos dominios que contengan el carácter ñ):

import re

urls = ["https://pildorasinformaticas.es",
        "ftp://pildorasinformaticas.es",
        "https://pildorasinformaticas.com",
        "ftp://pildorasinformaticas.com",
        "https://informaticaenespaña.es"]

[print(url) for url in urls if re.findall("[ñ]", url)]
https://informaticaenespaña.es

Un ejemplo un tanto más complejo: en una lista de palabras, queremos encontrar si se hallan las palabras niños y niñas. Como solo se diferencias ambas cadenas en un carácter, podemos escribir:

import re

urls = ["hombres", "mujeres", "mascotas", "niños", "niñas"]

[print(url) for url in urls if re.findall("niñ[oa]s", url)]
niños
niñas

Nota: al escribir [oa] no exigimos que deban estar presentes los dos caracteres y en ese preciso orden. La función findall() nos arrojará una coincidencia cuando alguno de los dos esté presente (o ambos, siendo indiferente el orden en el que se encuentren en este último caso).

Esta estrategia es también útil cuando lidiamos con tildes:

import re

urls = ["hombres", "mujeres", "mascotas", "camión", "camion"]

[print(url) for url in urls if re.findall("cami[oó]n", url)]
camión
camion

Código fuente

El código fuente y los posibles ficheros externos generados correspondientes a esta lección se encuentran disponibles para su consulta en la carpeta /lecciones/70/ del repositorio.

Anterior
Siguiente