Saltar al contenido
src / articulos / 03-cadenas-de-texto.md

Cadenas de Texto en Python

Emilio Castro //
// NARRACIÓN 0:00 / 0:00

En administración de sistemas y DevOps, el trabajo con texto es constante. Extraer una IP de un log, parsear un .yaml, armar un mensaje de alerta: todo converge en lo mismo.

Las cadenas en Python (str) son secuencias inmutables de caracteres. Que sean inmutables no es un detalle menor: la cadena original nunca se toca. Cada operación produce una cadena nueva en memoria.

Declaración y Definición

Se definen con comillas simples (') o dobles ("). Son funcionalmente idénticas, así que elige una y quédate con ella en todo el proyecto.

endpoint_api = 'https://api.produccion.internal/v1/status'
comando_sql = "SELECT * FROM users WHERE active=true;"

Operaciones Estructurales

Concatenación

La concatenación une cadenas para armar comandos, URLs o mensajes de alerta.

base_url = "https://metrics.internal"
ruta_recurso = "/api/v1/cpu_usage"
url_completa = base_url + ruta_recurso
print(url_completa)  # https://metrics.internal/api/v1/cpu_usage

Multiplicación (Repetición)

El operador * repite un bloque de caracteres. Lo uso mucho para separadores visuales en scripts de terminal: cuando estás revisando cientos de líneas de log, la diferencia entre output estructurado y ruido puro es enorme.

separador_log = "-" * 50
print(separador_log)  # --------------------------------------------------

Indexación y Segmentación (Slicing)

Los índices en Python arrancan en 0. Los negativos recorren la cadena desde el final, lo que te ahorra calcular la longitud antes de acceder al último token de una línea.

ip_address = "192.168.1.10"
print(ip_address[0])   # '1' (Primer dígito)
print(ip_address[-2:]) # '10' (Últimos dos dígitos)

Métodos de Procesamiento y Análisis

Los objetos string traen métodos integrados que resuelven la mayoría de los casos reales. Sin imports, sin dependencias externas.

.upper() y .lower()

Normalizar antes de comparar evita bugs que son difíciles de reproducir y peores de explicar en un postmortem. “Running” y “running” son la misma cosa para cualquier persona, pero no para un if.

estado_pod = "CrashLoopBackOff"
print(estado_pod.upper())  # CRASHLOOPBACKOFF
print(estado_pod.lower())  # crashloopbackoff

.split()

Este es el método que más vas a invocar trabajando con infraestructura. Divide una cadena por un delimitador, devuelve una lista, y con eso ya puedes extraer cualquier campo de una línea de syslog o descomponer una ruta. Simple y directo.

# Ejemplo analizando una línea estándar de un archivo syslog
linea_log = "May 25 14:02:18 prod-db-1 sshd[1234]: Accepted password for admin"
elementos = linea_log.split()
print(elementos[4])  # prod-db-1 (El nombre del host)

# Separar una ruta de archivo
ruta_absoluta = "/var/log/nginx/access.log"
directorios = ruta_absoluta.split("/")
print(directorios[-1])  # access.log (El nombre del archivo)

Lo que acabas de ver cubre un porcentaje alto del trabajo real de automatización. Tomas stdout crudo, lo partes con .split(), lo normalizas con .lower(), y lo rearmas como necesites. La biblioteca estándar alcanza para casi todo esto sin agregar una sola dependencia, lo cual importa bastante cuando despliegas en entornos con acceso restringido a internet.