Python // Automation Cookbook
Capítulo 1: Comencemos Nuestro Viaje de Automatización
Parte 4: Expresiones Regulares
Una expresión regular (regex) es un patrón para coincidir con texto. Son increíblemente poderosas pero también pueden ser notoriamente complicadas.
RECETA_07
Introducción a las Expresiones Regulares
Caracteres Especiales Básicos
| SÍMBOLO | SIGNIFICADO |
|---|---|
^ | Inicio de la cadena |
$ | Final de la cadena |
\b | Límite de palabra |
\S | Cualquier carácter no-espacio |
\d | Cualquier dígito (0-9) |
\w | Cualquier letra o dígito |
. | Cualquier carácter |
+ | Una o más repeticiones |
Ejemplos Básicos
python
>>> import re # Buscar 'LOG' en cualquier posición >>> re.search(r'LOG', 'SOME LOGS') <Match object; span=(5, 8), match='LOG'> # Buscar solo al INICIO (^) >>> re.search(r'^LOG', 'LOGS') <Match object; span=(0, 3), match='LOG'> >>> re.search(r'^LOG', 'SOME LOGS') None # Buscar solo al FINAL ($) >>> re.search(r'LOG$', 'SOME LOG') <Match object; span=(5, 8), match='LOG'>
Coincidencia con Clases de Caracteres
python - número de teléfono
# [0123456789-]+ coincide números y guiones, una o más veces >>> re.search(r'[0123456789-]+', 'phone: 1234-567-890').group() '1234-567-890' # Email simple usando \S (no-espacio) >>> re.search(r'\S+@\S+', 'email: test@example.com').group() 'test@example.com'
Siempre usa el prefijo
r para patrones regex (raw strings). Esto evita problemas con caracteres de escape como \n.
"Algunas personas, cuando se enfrentan a un problema, piensan 'Ya sé, usaré expresiones regulares.' Ahora tienen dos problemas."
— Jamie Zawinski
RECETA_08
Profundizando en las Expresiones Regulares
Grupos de Captura
Los paréntesis crean grupos que pueden recuperarse individualmente:
python
>>> match = re.search(r'phone number is ([\d-]+)', '37: phone number is 1234-567-890') >>> match.group() # Coincidencia completa 'phone number is 1234-567-890' >>> match.group(1) # Solo el primer grupo '1234-567-890'
Compilar Patrones y Opciones
python
# Compilar para reutilización + IGNORECASE >>> pattern = re.compile(r'answer to question (\w+) is (yes|no)', re.IGNORECASE) >>> pattern.search('The answer to question 3b is YES').groups() ('3b', 'YES')
Encontrar Múltiples Coincidencias
python
# Ciudades y estados de EE.UU. >>> PATTERN = re.compile(r'([A-Z][\w\s]+?).(TX|OR|OH|MI)') >>> TEXT = 'Odessa,TX and Corvallis OR and Toledo.OH' # finditer() retorna todos los matches >>> for match in PATTERN.finditer(TEXT): ... print(match.groups()) ('Odessa', 'TX') ('Corvallis', 'OR') ('Toledo', 'OH') # findall() retorna solo los grupos >>> PATTERN.findall(TEXT) [('Odessa', 'TX'), ('Corvallis', 'OR'), ('Toledo', 'OH')]
Grupos con Nombre
python
>>> PATTERN = re.compile(r'(?P<city>[A-Z][\w\s]+?).(?P<state>TX|OR|OH)') >>> match = PATTERN.search('Visit Odessa,TX') >>> match.groupdict() {'city': 'Odessa', 'state': 'TX'} >>> match.group('city') 'Odessa'
Caracteres Especiales Invertidos
| SÍMBOLO | SIGNIFICADO |
|---|---|
\D | Cualquier NO-dígito |
\W | Cualquier NO-letra |
\S | Cualquier NO-espacio |
\B | NO límite de palabra |
Para probar tus regex interactivamente, usa regex101.com con el modo Python activado. Muestra explicaciones de cada elemento del patrón.