viernes, 6 de marzo de 2026

Automatizacion con Python - Cap1 - parte 4

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ÍMBOLOSIGNIFICADO
^Inicio de la cadena
$Final de la cadena
\bLímite de palabra
\SCualquier carácter no-espacio
\dCualquier dígito (0-9)
\wCualquier 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ÍMBOLOSIGNIFICADO
\DCualquier NO-dígito
\WCualquier NO-letra
\SCualquier NO-espacio
\BNO 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.

Basado en "Python Automation Cookbook" // Jaime Buelta

Traducción al español // Capítulo 1, Parte 4 de 5