Expresiones Regulares en Python: Guía Práctica con el Módulo re
Una expresión regular es una secuencia especial de caracteres que ayuda a buscar o encontrar cadenas usando una sintaxis especializada en un patrón. Son ampliamente usadas en el mundo UNIX.
El módulo re de Python proporciona soporte completo para expresiones regulares tipo Perl. Lanza re.error si ocurre un error al compilar o usar una expresión regular.
Usaremos cadenas raw como r'expresion' para evitar confusión con caracteres especiales.
La Función match
Intenta hacer coincidir el patrón RE al principio de la cadena.
re.match(pattern, string, flags=0)
Parámetros: pattern (expresión regular), string (cadena a buscar), flags (modificadores con OR bitwise).
Retorna un objeto match si tiene éxito, None si falla. Usa group(num) o groups() para obtener la expresión coincidente.
Ejemplo
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M | re.I)
if matchObj:
print("matchObj.group():", matchObj.group())
print("matchObj.group(1):", matchObj.group(1))
print("matchObj.group(2):", matchObj.group(2))
else:
print("No match!!")
Resultado: Cats are smarter than dogs, grupos: Cats, smarter.
La Función search
Busca la primera ocurrencia del patrón RE en cualquier parte de la cadena.
re.search(pattern, string, flags=0)
Parámetros iguales que match, pero busca en toda la cadena. Retorna objeto match o None.
Ejemplo
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I)
if searchObj:
print("searchObj.group():", searchObj.group())
print("searchObj.group(1):", searchObj.group(1))
print("searchObj.group(2):", searchObj.group(2))
else:
print("Nothing found!!")
Coincidencia vs Búsqueda
match verifica solo al inicio de la cadena; search verifica en cualquier posición (comportamiento por defecto de Perl).
Ejemplo
#!/usr/bin/python import re line = "Cats are smarter than dogs" matchObj = re.match(r'dogs', line, re.M | re.I) searchObj = re.search(r'dogs', line, re.M | re.I) # match: No match!! | search: dogs
Búsqueda y Reemplazo
El método sub es uno de los más importantes del módulo re.
re.sub(pattern, repl, string, max=0)
Reemplaza todas las ocurrencias del patrón en la cadena con repl, a menos que se especifique max. Retorna la cadena modificada.
Ejemplo
#!/usr/bin/python
import re
phone = "2004-959-559 # This is Phone Number"
# Eliminar comentarios estilo Python
num = re.sub(r'#.*$', "", phone)
print("Phone Num:", num)
# Eliminar todo excepto dígitos
num = re.sub(r'\D', "", phone)
print("Phone Num:", num)
Resultado: 2004-959-559 y 2004959559.
Modificadores de Expresiones Regulares (Banderas)
| Bandera | Descripción |
|---|---|
| re.I | Coincidencia sin distinción de mayúsculas/minúsculas. |
| re.L | Interpreta palabras según configuración local actual. |
| re.M | $ coincide con fin de línea (no solo fin de cadena); ^ coincide con inicio de línea. |
| re.S | El punto (.) coincide con cualquier carácter, incluyendo salto de línea. |
| re.U | Interpreta letras según juego de caracteres Unicode. |
| re.X | Sintaxis "más limpia": ignora espacios en blanco y trata # sin escape como comentario. |
Patrones de Expresiones Regulares
Excepto caracteres de control (+ ? . * ^ $ ( ) [ ] { } | \), todos los caracteres coinciden consigo mismos. Escapa un carácter de control con barra invertida.
| Patrón | Descripción |
|---|---|
| ^ | Inicio de línea. |
| $ | Fin de línea. |
| . | Cualquier carácter excepto salto de línea. |
| [...] | Cualquier carácter en corchetes. |
| [^...] | Cualquier carácter NO en corchetes. |
| re* | 0 o más ocurrencias de la expresión anterior. |
| re+ | 1 o más ocurrencias. |
| re? | 0 o 1 ocurrencia. |
| re{n} | Exactamente n ocurrencias. |
| re{n,} | n o más ocurrencias. |
| re{n,m} | Entre n y m ocurrencias. |
| a|b | Coincide con a o b. |
| (re) | Agrupa y recuerda texto coincidente. |
| (?imx) | Activa opciones i, m, x temporalmente. |
| (?-imx) | Desactiva opciones i, m, x temporalmente. |
| (?:re) | Agrupa sin recordar (non-capturing). |
| (?P | Grupo con nombre (Python extension). |
| \w | Caracteres de palabra [A-Za-z0-9_]. |
| \W | No caracteres de palabra. |
| \s | Espacio en blanco [\t\n\r\f]. |
| \S | No espacio en blanco. |
| \d | Dígitos [0-9]. |
| \D | No dígitos. |
| \A | Inicio de cadena. |
| \Z | Fin de cadena (antes de salto de línea final si existe). |
| \z | Fin de cadena absoluto. |
| \b | Límite de palabra (fuera de corchetes). |
| \B | No límite de palabra. |
| \1...\9 | Referencia a subexpresión agrupada n-ésima. |
Ejemplos Prácticos
Clases de Caracteres
| Ejemplo | Descripción |
|---|---|
| [Pp]ython | "Python" o "python" |
| rub[ye] | "ruby" o "rube" |
| [aeiou] | Cualquier vocal minúscula |
| [0-9] | Cualquier dígito |
| [a-zA-Z0-9] | Letra o dígito |
| [^aeiou] | Cualquier cosa excepto vocal minúscula |
Clases Especiales
| Ejemplo | Descripción |
|---|---|
| \d | Dígito: [0-9] |
| \D | No dígito: [^0-9] |
| \s | Espacio en blanco: [ \t\r\n\f] |
| \S | No espacio en blanco |
| \w | Carácter de palabra: [A-Za-z0-9_] |
| \W | No carácter de palabra |
Repetición
| Ejemplo | Descripción |
|---|---|
| ruby? | "rub" o "ruby" (y opcional) |
| ruby* | "rub" + 0 o más "y" |
| ruby+ | "rub" + 1 o más "y" |
| \d{3} | Exactamente 3 dígitos |
| \d{3,} | 3 o más dígitos |
| \d{3,5} | 3, 4 o 5 dígitos |
Repetición No Codiciosa (Nongreedy)
| Ejemplo | Descripción |
|---|---|
| <.*> | Codicioso: coincide "<python>perl>" |
| <.*?> | No codicioso: coincide "<python>" en "<python>perl>" |
Agrupación con Paréntesis
| Ejemplo | Descripción |
|---|---|
| \D\d+ | Sin grupo: + repite \d |
| (\D\d)+ | Agrupado: + repite par \D\d |
| ([Pp]ython(, )?)+ | "Python", "Python, python, python", etc. |
Referencias Hacia Atrás (Backreferences)
| Ejemplo | Descripción |
|---|---|
| ([Pp])ython\1ails | Coincide "python\1ails" o "Python\1ails" |
| (['"])[^\1]*\1 | Cadena entre comillas simples o dobles |
Alternativas
| Ejemplo | Descripción |
|---|---|
| python|perl | "python" o "perl" |
| rub(y|le) | "ruby" o "ruble" |
| Python(!+|\?) | "Python" seguido de uno o más ! o un ? |
Anclas
| Ejemplo | Descripción |
|---|---|
| ^Python | "Python" al inicio de cadena/línea |
| Python$ | "Python" al final de cadena/línea |
| \APython | "Python" al inicio de cadena |
| Python\Z | "Python" al final de cadena |
| \bPython\b | "Python" en límite de palabra |
| Python(?=!) | "Python" si seguido de ! (lookahead positivo) |
| Python(?!\!) | "Python" si NO seguido de ! (lookahead negativo) |
python
- Expresiones regulares en C#: Guía práctica
- Dominando tipos de datos en Python: Guía práctica
- Dominando operadores en Python: Guía completa
- Dominando la sentencia pass en Python: Guía práctica
- Dominando argumentos de funciones en Python: Posicionales, por palabra clave y por defecto
- Dominando Diccionarios en Python: Creación, Manipulación y Técnicas Avanzadas
- Dominando Iteradores en Python: Cómo Funcionan y Cómo Crear los Tuyos
- Explicación de Closures en Python: Cómo las Funciones Anidadas Capturan Variables
- Expresiones Regulares en Python (Módulo re) – Guía Práctica
- Dominando datetime en Python: Guía Práctica de Fechas, Horas y Zonas Horarias
- Expresiones Regulares en Java: Dominando la Coincidencia de Patrones con java.util.regex