71. Expresiones regulares III
Vídeo
Notas personales
En esta lección, continuaremos el estudio de las expresiones regulares analizando cómo trabajar con rangos. Estos nos permiten buscar patrones indicando un rango de números, de caracteres, etc.
Por ejemplo, a partir de una lista de nombres, supongamos que estamos interesados en hallar todos aquellos que tengan letras comprendidas entre la o
y la t
:
import re
nombres = ["Ana", "Pedro", "María", "Rosa", "Sandra", "Celia"]
[print(nombre) for nombre in nombres if re.findall("[o-t]", nombre)]
Pedro
María
Rosa
Sandra
Nota: los rangos son case sensitive, esto es, distinguen entre minúsculas y mayúsculas. Por ejemplo, si combinamos el rango anterior con el ancla ^
, la ejecución no arrojará resultado alguno, porque todos los nombres están declarados con su inicial en mayúscula.
import re
nombres = ["Ana", "Pedro", "María", "Rosa", "Sandra", "Celia"]
[print(nombre) for nombre in nombres if re.findall("^[o-t]", nombre)]
No obstante, completando el rango solucionamos esta situación:
import re
nombres = ["Ana", "Pedro", "María", "Rosa", "Sandra", "Celia"]
[print(nombre) for nombre in nombres if re.findall("^[o-tO-T]", nombre)]
Pedro
Rosa
Sandra
A continuación, estudiemos el uso de rangos cuando se nos presenta una lista de códigos:
import re
codigos = ["Ma1", "Se1", "Ma2", "Ba1", "Ma3", "Va1", "Va2", "Ma4"]
[print(codigo) for codigo in codigos if re.findall("Ma[0-3]", codigo)]
Ma1
Ma2
Ma3
Por otro lado, Python nos permite la posibilidad de negar rangos, es decir, de obtener aquellos resultados que no se ajustan al patrón de búsqueda especificado. Para ello, antecediendo el rango, utilizamos el carácter ^
:
import re
codigos = ["Ma1", "Se1", "Ma2", "Ba1", "Ma3", "Va1", "Va2", "Ma4"]
[print(codigo) for codigo in codigos if re.findall("Ma[^0-3]", codigo)]
Ma4
Acto seguido, agreguemos algunos códigos nuevos y sigamos experimentando el uso de rangos:
import re
codigos = ["Ma1", "Se1", "Ma2", "Ba1", "Ma3", "Va1", "Va2", "Ma4",
"MaA", "Ma5", "MaB", "MaC"]
[print(codigo) for codigo in codigos if re.findall("Ma[0-3A-B]", codigo)]
Ma1
Ma2
Ma3
MaA
MaB
Ahora, insertemos algunos caracteres especiales en mitad de ciertos códigos y veamos entonces cómo lidiar con ellos. Imaginemos que buscamos todos aquellos cuyo tercer carácter sea bien un punto, bien dos puntos:
import re
codigos = ["Ma.1", "Se1", "Ma2", "Ba1", "Ma:3", "Va1", "Va2", "Ma4",
"MaA", "Ma.5", "MaB", "Ma:C"]
[print(codigo) for codigo in codigos if re.findall("Ma[.:]", codigo)]
Ma.1
Ma:3
Ma.5
Ma:C
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/71/
del
repositorio.