Expresiones regulares (RegEx) + Python
Conceptos básicos para iniciarse
Nota: Puedes ejecutar este post en Google Colab o Binder o verlo en GitHub, pulsa el icono.
Expresiones regulares (RegEx) es un pequeño lenguaje que usa cadenas de caracteres para encontrar patrones o sustituir caracteres dentro de un texto.
Están integrados en multitud de aplicaciones y lenguajes de programación facilitando enormemente el trabajo con textos.
En python tenemos el módulo re. Para usarlo introducimos lo siguiente:
import re
Definimos un patrón y una cadena donde buscarlo:
patron="dos"
cadena = "dos"
Se crea un objeto expresión regular y se busca en la cadena de texto
re_object = re.compile(patron)
print(re_object.search(cadena))
print (r"Aquí uso 'r' \n")
print ("\n Aquí no uso 'r' \n y tenemos \n el salto")
A la hora de buscar patrones, tenemos diferentes metodos en re, entre los que destacan:
Método | Explicación |
---|---|
match() | busca el patrón al principio de la cadena |
search() | busca el patrón en cualquier parte de la cadena |
findall() | devuelve lista con las subcadena que encuentre |
finditer() | devuelve iterador con las subcadena que encuentre |
patron = "t[a-z]la"
cadena = "tila tela tla"
re_object = re.compile(patron)
print(re_object.findall(cadena))
patron = "[^321t]"
cadena = "lote1234 @"
re_object = re.compile(patron)
print(re_object.findall(cadena))
patron = "pe[rro|na|lea]"
cadena = "perro"
re_object = re.compile(patron)
print(re_object.search(cadena))
Sirve para indicar formas especiales o para permitir el uso de caracteres especiales sin invocar su significado especial.
print ("Un salto de línea: \n...continuación\n")
print ("Anulamos el significado especial con otro '\\': \\n")
Metacaracter | Explicación | Equivalencia |
---|---|---|
\d | cualquier dígito decimal | [0-9] |
\D | cualquier caracter no dígito decimal | [^0-9] |
\w | cualquier caracter alfanumérico | [a-zA-Z0-9_] |
\W | cualquier caracter NO alfanumérico | [^a-zA-Z0-9_] |
\s | cualquier caracter espacio en blanco | [ \t\n\r\f\v] |
\S | cualquier caracter NO espacio en blanco | [^ \t\n\r\f\v] |
cadena = "lote1234 @"
re.findall(r'\d', cadena)
re.findall(r'\D', cadena)
re.findall(r'\w', cadena)
re.findall(r'\W', cadena)
re.findall(r'\s', cadena)
cadena = "archivo123.pdf"
re.findall(r'(archivo\d*).pdf', cadena)
Metacaracter | Explicación |
---|---|
^ \$ | inicio y fin de línea |
\A \Z | inicio y fin de texto |
\b | inicio o fin de una palabra |
\B | inicio o fin distinto de una palabra |
Metacaracter | Explicación |
---|---|
* | 0 o más veces |
+ | 1 o más veces |
? | 0 o 1 vez |
{m,n} | de m a n veces |
Ejemplos:
cadena = "csa casa caasa caaasa"
re.findall(r'ca*sa', cadena)
re.findall(r'ca+sa', cadena)
re.findall(r'ca?sa', cadena)
re.findall(r'ca{2,3}sa', cadena)
cadena = "usuario@empresa.es"
re.findall(r'\b[\w._%+-]+@[\w.-]+\.[a-zA-Z]{2,4}\b', cadena)
cadena = "foto123.jpg foto32.png texto.doc imagen.gif"
re.findall(r'([\w]+\.[jpg|jpeg|png|gif])', cadena)