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.