Expresiones Regulares en Python (Módulo re) – Guía Práctica
Expresiones Regulares en Python (Módulo re) – Guía Práctica
Descubre cómo aprovechar el poder de las expresiones regulares en Python con el módulo re. Ejemplos paso a paso ilustran patrones comunes, técnicas de matching y funciones avanzadas.
¿Qué es una Expresión Regular?
expresión regular (RegEx) es una secuencia de caracteres que define un patrón de búsqueda. Por ejemplo, el patrón ^a...s$ coincide con cualquier cadena de cinco letras que empiece con a y termine con s.
^a...s$
Los patrones pueden usarse para comparar contra cadenas. La tabla siguiente demuestra cómo se comporta el patrón con diferentes entradas:
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
^a...s$ | abs | No coincide |
alias | Coincide | |
abyss | Coincide | |
Alias | No coincide | |
Un ábaco | No coincide |
El módulo re de Python proporciona las herramientas necesarias para trabajar con RegEx. Aquí un ejemplo rápido que usa re.match() para verificar un patrón contra una cadena:
import re
pattern = '^a...s$'
test_string = 'abyss'
result = re.match(pattern, test_string)
if result:
print("Búsqueda exitosa.")
else:
print("Búsqueda fallida.")
Cuando el patrón se encuentra, re.match() devuelve un objeto match; de lo contrario devuelve None.
Especificando Patrones con Metacaracteres
Los metacaracteres son símbolos especiales que el motor regex interpreta de manera única. Referencia rápida de los más comunes:
[] . ^ $ * + ? {} () \ |
Corchetes: []
Los corchetes definen un conjunto de caracteres a coincidir. Por ejemplo, [abc] coincide con cualquier ocurrencia simple de a, b o c.
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
[abc] | a | 1 coincidencia |
ac | 2 coincidencias | |
Hey Jude | No coincide | |
abc de ca | 5 coincidencias |
Rangos pueden expresarse con guion, ej. [a-e] equivale a [abcde]. Para invertir un conjunto, coloca un acento circunflejo ^ después del corchete de apertura, ej. [^abc] coincide con cualquier carácter excepto a, b o c.
Punto: .
El punto coincide con cualquier carácter simple excepto nueva línea.
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
.. | a | No coincide |
ac | 1 coincidencia | |
acd | 1 coincidencia | |
acde | 2 coincidencias (contiene 4 caracteres) |
Circunflejo: ^ y Dólar: $
El circunflejo afirma inicio de cadena; el signo dólar afirma final. Por ejemplo, ^a coincide con cualquier cadena que empiece con a, mientras que a$ coincide con cualquier cadena que termine con a.
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
^a | a | 1 coincidencia |
abc | 1 coincidencia | |
bac | No coincide | |
^ab | abc | 1 coincidencia |
acb | No coincide (empieza con a pero no seguido de b) |
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
a$ | a | 1 coincidencia |
fórmula | 1 coincidencia | |
cab | No coincide |
Cuantificadores: *, +, ?, {n,m}
Estos símbolos controlan cuántas veces debe aparecer el elemento precedente.
*– cero o más veces.+– una o más veces.?– cero o una vez.{n,m}– al menos n y como máximo m veces.
Ejemplos:
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
ma*n | mn | 1 coincidencia |
man | 1 coincidencia | |
maaan | 1 coincidencia | |
main | No coincide (a no seguido de n) | |
woman | 1 coincidencia |
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
ma+n | mn | No coincide (sin a) |
man | 1 coincidencia | |
maaan | 1 coincidencia | |
main | No coincide (a no seguido de n) | |
woman | 1 coincidencia |
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
ma?n | mn | 1 coincidencia |
man | 1 coincidencia | |
maaan | No coincide (más de un a) | |
main | No coincide (a no seguido de n) | |
woman | 1 coincidencia |
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
a{2,3} | abc dat | No coincide |
abc daat | 1 coincidencia (en daat) | |
aabc daaat | 2 coincidencias (en aabc y daaat) | |
aabc daaaat | 2 coincidencias (en aabc y daaaat) |
Patrón común: [0-9]{2,4} coincide con dos a cuatro dígitos consecutivos.
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
[0-9]{2,4} | ab123csde | 1 coincidencia (en ab123csde) |
12 y 345673 | 3 coincidencias (12, 3456, 73) | |
1 y 2 | No coincide |
Alternación: |
La barra vertical implementa OR lógico. Por ejemplo, a|b coincide con cualquier cadena que contenga a o b.
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
a|b | cde | No coincide |
ade | 1 coincidencia (en ade) | |
acdbea | 3 coincidencias (en acdbea) |
Agrupación: ()
Los paréntesis agrupan sub-patrones y capturan subcadenas coincidentes. Ejemplo: (a|b|c)xz coincide con cualquier cadena que contenga a, b o c seguido de xz.
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
(a|b|c)xz | ab xz | No coincide |
abxz | 1 coincidencia (en abxz) | |
axz cabxz | 2 coincidencias (en axzbc cabxz) |
Escape: \
Usa barra invertida para tratar un metacarácter como literal. Por ejemplo, \$a coincide con la secuencia literal $a en lugar de interpretar $ como ancla de fin de cadena.
Secuencias Especiales
Las secuencias especiales simplifican patrones comunes. Lista de referencia con ejemplos ilustrativos.
Inicio de Cadena: \A
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
\Athe | the sun | Coincide |
In the sun | No coincide |
Límite de Palabra: \b
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
\bfoo | fútbol | Coincide |
un fútbol | Coincide | |
afútbol | No coincide | |
foo\b | el foo | Coincide |
el afoo test | Coincide | |
el afootest | No coincide |
No Límite de Palabra: \B
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
\Bfoo | fútbol | No coincide |
un fútbol | No coincide | |
afútbol | Coincide | |
foo\B | el foo | No coincide |
el afoo test | No coincide | |
el afootest | Coincide |
Dígito: \d / No Dígito: \D
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
\d | 12abc3 | 3 coincidencias (en 12abc3) |
Python | No coincide | |
\D | 1ab34"50 | 3 coincidencias (en 1ab34"50) |
1345 | No coincide |
Espacio en Blanco: \s / No Espacio: \S
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
\s | Python RegEx | 1 coincidencia |
PythonRegEx | No coincide | |
\S | a b | 2 coincidencias (en a b) |
| No coincide |
Carácter de Palabra: \w / No Palabra: \W
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
\w | 12&": ;c | 3 coincidencias (en 12": ;c) |
"%> ! | No coincide | |
\W | 1a2%c | 1 coincidencia (en 1a2%c) |
Python | No coincide |
Fin de Cadena: \Z
| Expresión | Cadena | ¿Coincide? |
|---|---|---|
Python\Z | Me gusta Python | 1 coincidencia |
Me gusta Python Programación | No coincide | |
Python es divertido. | No coincide |
Consejo: Usa un tester de regex online como regex101 para crear y depurar patrones rápidamente.
Usando RegEx en Python
El módulo re de Python ofrece un rico conjunto de funciones y constantes para operaciones regex. Impórtalo con:
import re
Abajo las utilidades más comunes y cómo usarlas.
re.findall()
Devuelve lista de todas las coincidencias no superpuestas en una cadena.
# Extraer todos los números de una cadena
import re
string = 'hola 12 hi 89. Qué tal 34'
pattern = '\d+'
result = re.findall(pattern, string)
print(result) # Salida: ['12', '89', '34']
Cuando no se encuentra coincidencia, devuelve lista vacía.
re.split()
Divide una cadena en cada punto donde el patrón coincide, devolviendo lista de subcadenas.
import re
string = 'Doce:12 Ochenta y nueve:89.'
pattern = '\d+'
result = re.split(pattern, string)
print(result) # Salida: ['Doce:', ' Ochenta y nueve:', '.']
Usa el argumento opcional maxsplit para limitar número de divisiones. Valor 0 (default) divide en cada coincidencia.
import re
string = 'Doce:12 Ochenta y nueve:89 Nueve:9.'
pattern = '\d+'
# Dividir solo en la primera ocurrencia
result = re.split(pattern, string, 1)
print(result) # Salida: ['Doce:', ' Ochenta y nueve:89 Nueve:9.']
re.sub()
Reemplaza todas las ocurrencias de un patrón con una cadena de reemplazo.
# Eliminar todos los caracteres de espacio en blanco
import re
string = 'abc 12\nde 23 \n f45 6'
pattern = '\s+'
replace = ''
new_string = re.sub(pattern, replace, string)
print(new_string) # Salida: abc12de23f456
Para limitar reemplazos, proporciona argumento count. Valor 0 reemplaza cada coincidencia.
new_string = re.sub(r'\s+', replace, string, 1)
print(new_string) # Salida:
# abc12de 23
# f45 6
re.subn()
Como re.sub(), pero devuelve tupla con la nueva cadena y número de sustituciones realizadas.
new_string = re.subn(pattern, replace, string)
print(new_string) # Salida: ('abc12de23f456', 4)
re.search()
Encuentra la primera ubicación donde el patrón coincide.
string = "Python es divertido"
match = re.search('\\APython', string)
if match:
print("patrón encontrado dentro de la cadena")
else:
print("patrón no encontrado")
# Salida: patrón encontrado dentro de la cadena
Objeto Match
Cuando se encuentra coincidencia, re.search() devuelve un objeto Match. Métodos y atributos comunes incluyen:
group()– la subcadena coincidente.start()/end()– índices de la coincidencia.span()– tupla de (inicio, fin).groups()– todos los grupos capturados.
string = '39801 356, 2102 1111'
pattern = '(\\d{3}) (\\d{2})'
match = re.search(pattern, string)
if match:
print(match.group())
print(match.group(1))
print(match.group(2))
print(match.groups())
print(match.start(), match.end(), match.span())
else:
print("patrón no encontrado")
# Salida:
# 801 35
# 801
# 35
# ('801', '35')
# 2 8 (2, 8)
Usando Raw Strings (prefijo r)
Prefijar un literal de cadena con r trata barras invertidas como caracteres literales, previniendo secuencias de escape accidentales. Esto es especialmente útil en patrones regex.
string = '\n y \r son secuencias de escape.'
result = re.findall(r'[\n\r]', string)
print(result) # Salida: ['\n', '\r']
Para exploración más profunda del módulo re, consulta la documentación oficial de Python.
python
- Palabras clave e identificadores en Python: Dominando palabras reservadas y convenciones de nomenclatura
- 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
- Dominando datetime en Python: Guía Práctica de Fechas, Horas y Zonas Horarias
- Dominar el Módulo time de Python: Funciones, Structs y Ejemplos Prácticos
- Dominar time.sleep() en Python: Mejores Prácticas, Multihilo y Ejemplos Reales