Skip to content
This page has been auto-translated and may contain errors.View in English

Cadenas de texto

docs.scrimba.com

El texto aparece en casi todos los programas que escribes. Nombres, mensajes, puntuaciones, etiquetas. En Python, cualquier pieza de texto se llama cadena de texto: cualquier valor que envuelvas entre comillas. Simple o doble, ambas funcionan de la misma manera.

Las cadenas de texto son el tipo de texto principal de Python. Llevan todo, desde un nombre de usuario hasta una ruta de URL hasta la salida formateada. Las comillas simples y dobles producen resultados idénticos; la elección es estilística.

str está en cada límite del sistema: E/S de terminal, contenidos de archivos, respuestas de red, datos serializados. Es el tipo de secuencia Unicode inmutable (no cambia después de la creación) de Python. Ambos estilos de comillas producen el mismo objeto, por lo que la elección entre ellos es puramente estilística.

python
greeting = "Hola, mundo"
username = 'juan'

La única vez que la elección de comillas importa es cuando tu texto contiene marcas de comillas. Usa el estilo opuesto para no tener que escaparlas:

La convención de la comunidad es usar comillas dobles. La razón práctica para cambiar de estilo es evitar escapar cuando el contenido contiene ese carácter:

La convención es comillas dobles, y formateadores como Black y Ruff lo aplican automáticamente. La única razón escrita a mano para cambiar es evitar una barra invertida cuando el contenido contiene el delimitador:

python
note = "Es un gran día"           # apóstrofo adentro, usa comillas dobles
message = 'Él dijo "hola"'        # comillas dobles adentro, usa comillas simples
escaped = "Él dijo \"hola\""      # o escapa con una barra invertida

Inmutabilidad

Las cadenas de texto son inmutables: una vez que las creas, no puedes cambiarlas. Piensa en una cadena de texto como fija permanentemente en el momento en que se crea. Cualquier operación que parezca modificar una cadena de texto en realidad produce una completamente nueva. La original permanece exactamente como estaba.

Las cadenas de texto son inmutables: ningún método modifica una cadena de texto en su lugar. Cada operación que transforma texto devuelve una nueva cadena de texto y deja la original intacta. La consecuencia práctica es que una llamada a método que no asignas en ningún lugar no tiene efecto en nada.

Los objetos str son inmutables, lo que significa que su contenido se fija una vez creado y nada puede escribir en ellos. Esto da a las cadenas de texto dos propiedades que realmente usas: son hashables (un valor cuyo contenido nunca cambia puede ser archivado por ese contenido, lo que permite que una cadena de texto sirva como clave de diccionario o miembro de conjunto), y son seguras para pasar entre nombres sin que nadie las copie, ya que nadie puede cambiar una cadena de texto compartida debajo de ti.

python
name = "juan"
name = name.upper()   # "JUAN" es una nueva cadena; "juan" no cambia

La consecuencia directa: no puedes cambiar un carácter en una posición específica. Python lanzará un error si lo intentas.

python
name = "juan"
name[0] = "J"   # TypeError: 'str' object does not support item assignment

Para obtener una cadena modificada, construye una nueva usando corte o un método. Ambos se cubren a continuación.

Intentar asignar un carácter muestra la restricción directamente:

python
name = "juan"
name[0] = "J"   # TypeError: 'str' object does not support item assignment

Cuando necesitas una versión modificada, las herramientas estándar son corte con concatenación para ediciones posicionales, y replace() para sustituciones. Ambas producen una nueva cadena de texto y dejan la original intacta.

Asignar a una posición (name[0] = "J") lanza TypeError cada vez, sin excepción. Para una edición posicional, construye una nueva cadena de texto cortando alrededor de la parte que quieres cambiar: name[:1].upper() + name[1:] capitaliza el primer carácter. Para una sustitución en cualquier parte de la cadena, replace().

JunoInmutabilidad Una cadena de texto nunca cambia una vez que existe. Cualquier cosa que parezca editarla te devuelve una nueva cadena en su lugar, así que asigna el resultado o se desvanece. La que me atrapó al principio: name[0] = "J" no funciona, lanza un TypeError.
JunoInmutabilidad Ningún método de cadena de texto edita en su lugar, todos devuelven una nueva cadena de texto y dejan la original sola. Así que name.upper() por sí solo no hace nada útil, tienes que asignarlo. Y name[0] = "J" lanza TypeError, no hay intercambio de caracteres en su lugar.
JunoInmutabilidad La inmutabilidad es lo que hace que las cadenas de texto sean hashables, para que funcionen como claves de dict, y seguras de compartir sin copiar. Resultado práctico: asigna el resultado de cada método que transforma, ya que ninguno toca el original. Para una edición posicional, corta alrededor del punto y reconstruye, ya que la asignación de elemento siempre lanza TypeError.

Indexación y corte

Cada carácter en una cadena de texto tiene una posición numerada, comenzando en cero. Puedes leer caracteres individuales poniendo ese número de posición entre corchetes. Los números negativos cuentan hacia atrás desde el final.

Las cadenas de texto son secuencias con indexación basada en cero. Los índices negativos cuentan desde el final. El corte extrae cualquier rango contiguo en una sola expresión, y nunca lanza un error en valores fuera de rango.

Una cadena de texto se comporta como una secuencia ordenada que puedes indexar y cortar. Leer una sola posición (s[i]) lanza IndexError si el índice apunta más allá del final. El corte (s[start:stop:step]) se comporta de manera diferente: los límites fuera de rango se sujetan silenciosamente a lo que existe, por lo que un corte nunca puede lanzar IndexError. Esa diferencia es la práctica a recordar: el acceso por índice es estricto, el corte es indulgente.

python
word = "Python"
#       012345

print(word[0])    # "P"
print(word[2])    # "t"
print(word[5])    # "n"
print(word[-1])   # "n"  (último carácter)
print(word[-2])   # "o"  (penúltimo)

-1 es siempre el último carácter, -2 el penúltimo, y así sucesivamente. Son útiles cuando quieres el final de una cadena de texto sin conocer su longitud exacta.

Los índices negativos se envuelven: -1 es len(s) - 1, -2 es len(s) - 2. Más útil para acceso anclado al final cuando no quieres calcular la longitud manualmente. Un índice negativo que se sale del rango sigue lanzando IndexError, igual que uno positivo.

Un índice negativo se convierte a len(s) + i antes de la verificación de límites, por lo que -1 aterriza en el último carácter y -2 en el anterior. Salirse del rango lanza IndexError de cualquier manera, positiva o negativa: solo el corte lo perdona, el indexado simple no.

El corte extrae un trozo. [start:stop] incluye start y excluye stop:

python
word = "Python"

print(word[0:2])   # "Py"     (posiciones 0 y 1)
print(word[2:])    # "thon"   (posición 2 al final)
print(word[:3])    # "Pyt"    (inicio a posición 2)
print(word[:])     # "Python" (una copia de toda la cadena)
print(word[::2])   # "Pto"    (cada segundo carácter)
print(word[::-1])  # "nohtyP" (invertido)

Tres patrones a los que recurrir más: word[:n] para los primeros n caracteres, word[n:] para todo desde la posición n en adelante, word[-n:] para los últimos n caracteres. word[::-1] invierte una cadena de texto. Se ve extraño la primera vez, pero es Python idiomático y lo verás a menudo.

A diferencia del indexado directo, el corte nunca lanza IndexError. Python sujeta los índices fuera de rango silenciosamente, por lo que word[100:] en una cadena corta devuelve "" en lugar de fallar. El argumento de paso controla el salto: word[::2] toma cada otro carácter, word[::-1] atraviesa en orden inverso.

En s[start:stop:step], cualquier parte que dejes fuera toma el valor por defecto de "el final natural para la dirección en la que vas", no un 0 fijo y len(). Con un paso positivo eso significa inicio a fin; con un paso negativo se invierte, por lo que start se convierte en el último carácter y stop corre fuera del frente. Es por eso que s[::-1] camina toda la cadena en orden inverso sin que escribas ningún límite, y la misma razón por la que s[::-2] te da cada segundo carácter hacia atrás.

JunoIndexación y corte Las posiciones comienzan en cero, así que word[0] es el primer carácter y word[-1] es el último. Un corte agarra un rango: word[start:stop] mantiene start y se detiene justo antes de stop. word[::-1] invierte la cadena de texto, que se ve extraño la primera vez y luego lo usas para siempre.
JunoIndexación y corte Indexa desde cero, o desde el final con negativos, donde word[-1] es el último carácter. Los cortes toman un rango que incluye start y excluye stop, y un tercer step establece el salto, así que word[::-1] invierte. La trampa a recordar: indexar más allá del final lanza IndexError, pero cortar más allá devuelve lo que hay en lugar de fallar.
JunoIndexación y corte El indexado simple es estricto y lanza IndexError fuera de rango, el corte es indulgente y sujeta a lo que existe, así que word[100:] devuelve "" en lugar de lanzar. Deja una parte de corte fuera y toma el valor por defecto del final natural para la dirección del paso, que es la razón exacta por la que word[::-1] invierte sin límites escritos. Recurre a un corte cuando prefieras no fallar en una entrada vacía o corta.

Métodos esenciales de cadena de texto

Las cadenas de texto vienen con un conjunto de métodos incorporados: operaciones que llamas directamente en cualquier valor de cadena de texto. Escribes la cadena de texto (o la variable que la contiene), luego un punto, luego el nombre del método. Cada método devuelve una nueva cadena de texto. La original nunca cambia.

Los métodos de cadena de texto son funciones adjuntas al tipo str. Dado que las cadenas de texto son inmutables, cada método devuelve una nueva cadena de texto en lugar de modificar la original. Una llamada a método que no asignas o pasas a algún lugar no tiene efecto duradero.

Cada método que transforma devuelve un nuevo str y deja el original solo, lo que sigue directamente de la inmutabilidad. También funcionan en puntos de código (los caracteres en sí, no los bytes brutos usados para almacenarlos), por lo que los métodos se comportan correctamente en texto acentuado y no latino sin que hagas nada especial. El compromiso a tener en cuenta: cada método asigna una nueva cadena de texto, por lo que encadenar muchos de ellos en texto grande significa muchas asignaciones.

Caso

python
text = "Hola, Mundo"

text.lower()       # "hola, mundo"
text.upper()       # "HOLA, MUNDO"
text.title()       # "Hola, Mundo"  (cada palabra capitalizada)
text.capitalize()  # "Hola, mundo"  (solo la primera palabra)

lower() y upper() son los dos que usarás más. lower() es particularmente útil cuando comparas texto: "Juan" y "juan" se vuelven lo mismo una vez que llamas .lower() en ambos lados.

lower() es el paso de normalización estándar antes de la comparación o almacenamiento. title() capitaliza la primera letra de cada palabra usando una regla aproximada que falla en contracciones: "it's" se convierte en "It'S". Trata como formato solo para visualización.

lower() aplica conversión de mayúsculas Unicode completa. Para comparación insensible a mayúsculas, casefold() es más correcto: aplica transformaciones adicionales (p. ej. ß alemán se convierte en ss) que lower() omite. title() capitaliza después de cualquier carácter no alfanumérico, lo que maneja mal contracciones y nombres con guión. Para correcto título de mayúsculas, implementa la lógica manualmente.

Espacios en blanco

python
text = "  hola  "

text.strip()    # "hola"    (ambos lados)
text.lstrip()   # "hola  "  (solo izquierda)
text.rstrip()   # "  hola"  (solo derecha)

strip() elimina espacios de ambos extremos de una cadena de texto. La usarás casi cada vez que manejes entrada del usuario o texto de un archivo, porque los espacios extraviados causan fallos silenciosos: "juan" != "juan ".

strip() elimina todo espaciado en blanco al inicio y al final: espacios, tabulaciones y saltos de línea. Las variantes direccionales te permiten limpiar solo un lado, útil para eliminar un salto de línea final sin tocar la sangría. Las tres aceptan un argumento de caracteres opcional para eliminar caracteres específicos en su lugar.

Sin argumento, strip() elimina todo tipo de espaciado en blanco de ambos extremos, incluyendo espacios en blanco no ASCII, no solo el espacio simple. Con un argumento de carácter elimina cualquiera de esos caracteres de los extremos, y esa es la trampa: el argumento es un conjunto de caracteres para eliminar, no un prefijo para coincidir. "xxholaxx".strip("x") devuelve "hola", pero "https://".strip("https") no elimina el prefijo "https", elimina cada h, t, p y s de ambos extremos y devuelve "://". Para eliminar un prefijo o sufijo conocido, usa removeprefix() y removesuffix() en su lugar.

Búsqueda

python
text = "Hola, mundo"

text.find("mundo")         # 6
text.find("Python")        # -1  (no encontrado)
text.count("l")            # 2
text.startswith("Hola")    # True
text.endswith("mundo")     # True

find() devuelve la posición donde comienza una pieza de texto dentro de tu cadena de texto. Si no está ahí, devuelve -1. Usa startswith() y endswith() cuando solo te importe si la cadena comienza o termina con algo específico.

find() devuelve el índice de inicio de la primera coincidencia, o -1. La convención -1 te permite usar el resultado directamente en corte o aritmética sin una verificación. startswith() y endswith() cada una aceptan una tupla de cadenas, por lo que puedes probar varios prefijos o sufijos en una sola llamada.

find() escanea de izquierda a derecha y devuelve -1 cuando no hay coincidencia. index() hace la misma búsqueda pero lanza ValueError en lugar de devolver -1: elige index() cuando una coincidencia faltante significa que tu código tiene un error y quieres que se detenga allí, find() cuando la ausencia es entrada normal que verificarás. Para una pregunta pura "¿comienza o termina con esto?", startswith() y endswith() dicen lo que quieres decir y se detienen en la primera falta de coincidencia, así que prefierelos sobre una verificación find() o in para ese trabajo.

Reemplazo

python
text = "Hola, mundo"

text.replace("mundo", "Python")   # "Hola, Python"
text.replace("l", "L")            # "HoLa, mundo"  (todas las ocurrencias)
text.replace("l", "L", 1)         # "HoLa, mundo"  (solo la primera)

replace() intercambia cada ocurrencia de una pieza de texto por otra y te devuelve una nueva cadena de texto. La original no cambia. Pasa un tercer argumento si solo quieres reemplazar la primera ocurrencia.

replace() reemplaza todas las ocurrencias no superpuestas por defecto. El argumento de recuento limita cuántas se reemplazan. Dado que devuelve una nueva cadena de texto, las llamadas pueden encadenarse: text.replace("a", "A").replace("e", "E") aplica ambas sustituciones en secuencia.

replace() coincide con una subcadena literal, no un patrón, por lo que no hace regex y trata cada carácter en el argumento como a sí mismo. Reemplaza coincidencias no superpuestas de izquierda a derecha, lo que puede sorprenderte: "aaa".replace("aa", "b") da "ba", no "bb", porque la segunda aa se superpone con la primera coincidencia. El argumento de recuento limita cuántas reemplaza, y como cada llamada devuelve una nueva cadena de texto puedes encadenarlas: text.replace(",", "").replace(" ", "_").

División y unión

split() corta una cadena de texto en piezas en un separador y las devuelve como una lista. Le dices en qué cortar:

split() particiona en un separador y devuelve los segmentos como una lista. Llamada sin argumento, divide en cualquier ejecución de espacios en blanco y descarta cadenas vacías de múltiples espacios consecutivos:

split(sep) escanea de izquierda a derecha, dividiendo en cada ocurrencia no superpuesta de sep. Sin argumento utiliza un algoritmo diferente: divide en cualquier ejecución de espaciado en blanco y elimina espaciado en blanco inicial y final del resultado. rsplit(sep, n) divide desde la derecha, útil para aislar el último segmento de una ruta con puntos o identificador con espacios de nombres.

python
csv_row = "María,28,Madrid"
parts = csv_row.split(",")     # ["María", "28", "Madrid"]

"  hola   mundo  ".split()   # ["hola", "mundo"]

split() devuelve una lista, una secuencia ordenada de valores. Reciben su propio capítulo en Listas; por ahora trátala como la secuencia de partes que split() produce y join() consume.

join() hace lo opuesto: combina una lista de cadenas de texto en una. La cadena de texto antes de .join() se coloca entre cada elemento:

python
words = ["Hola", "mundo"]

" ".join(words)    # "Hola mundo"
", ".join(words)   # "Hola, mundo"
"".join(words)     # "Holamundo"

El patrón a recordar: separator.join(list_of_strings). El separador va a la izquierda, la lista a la derecha. " ".join(words) pone un espacio entre cada palabra. "".join(words) las pega sin nada entre medio.

join() es la herramienta correcta cada vez que estés ensamblando una sola cadena de texto de múltiples piezas. Realiza una sola asignación en lugar de crear una nueva cadena de texto en cada paso. Para dos o tres cadenas, + está perfectamente bien. Una vez que tengas una lista de cualquier tamaño significativo, recurre a join().

join() camina por las piezas una vez, calcula el tamaño total, asigna el resultado una sola vez y escribe todo. Construir la misma cadena de texto con + repetido en un bucle es la forma cara: porque las cadenas de texto no pueden cambiar, cada + asigna una cadena de texto fresca y copia todo hasta ahora en ella, por lo que el costo crece con el cuadrado del número de piezas. En un puñado de cadenas nadie lo nota, pero en unos cuantos miles convierte una operación rápida en lenta. La regla que lo previene: recopila las piezas en una lista y join() una vez al final, nunca += una cadena de texto en un bucle.

JunoMétodos esenciales de cadena de texto Cada uno de estos devuelve una nueva cadena de texto, así que asigna el resultado o se va. El puñado que usarás diariamente: .lower() y .upper() para caso, .strip() para recortar espacios extraviados, .find() para ubicar texto (devuelve -1 cuando no está), .replace() para intercambiar texto, y .split() con sep.join() para desmontar una cadena de texto y armarla de nuevo.
JunoMétodos esenciales de cadena de texto Todos estos devuelven una nueva cadena de texto, ninguno muta, así que encadénalos o asígnalos. Mantén las trampas claras: .strip("x") toma un conjunto de caracteres para recortar, no un prefijo, y .split() sin argumento colapsa ejecuciones de espaciado en blanco. Para ensamblar muchas piezas, construye una lista y sep.join() la.
JunoMétodos esenciales de cadena de texto Las dos trampas que muerden en código real: .strip(chars) elimina un conjunto de caracteres de los extremos, no un prefijo, así que usa removeprefix() cuando quieras decir un prefijo, y construir una cadena de texto con += en un bucle es la forma lenta, así que recopila en una lista y join() una vez. Para comparación, normaliza con .casefold() sobre .lower(), y trata .title() como solo visualización ya que destroza contracciones.

f-strings

Las f-strings incrustan valores directamente dentro del texto. Pon f antes de la comilla de apertura, luego envuelve cualquier variable o expresión entre llaves. Python lo completa cuando se ejecuta el código. También puedes agregar dos puntos después del valor para controlar cómo se muestra.

Las f-strings evalúan cualquier expresión dentro de {} en tiempo de ejecución y convierten el resultado a una cadena de texto. Una coma dentro de las llaves introduce una especificación de formato: una sintaxis compacta para controlar lugares decimales, alineación y formato de números.

Cada {} en una f-string termina llamando al método __format__ de su propio valor (un dunder, el método de doble guión bajo que Python llama detrás de las escenas cuando formatea un valor), pasando junto lo que escribiste después de los dos puntos. Así que cualquier clase que escribas puede decidir cómo aparece dentro de una f-string definiendo __format__. Las banderas de conversión !r, !s y !a ejecutan repr(), str(), o ascii() en el valor primero; !r es la que conservar, porque muestra un valor de la manera que lo escribirías en código, comillas y escapes incluidos, que se muestra en la práctica a continuación.

python
name = "Juan"
score = 94.5

print(f"¡Hola, {name}!")           # "¡Hola, Juan!"
print(f"Puntuación: {score:.1f}%")      # "Puntuación: 94.5%"
print(f"2 + 2 = {2 + 2}")          # "2 + 2 = 4"
print(f"Nombre: {name.upper()}")     # "Nombre: JUAN"

La especificación de formato después de : controla cómo se muestra el valor:

SpecSignificadoEjemplo
.2f2 lugares decimalesf"{3.14159:.2f}""3.14"
.0%porcentaje, sin decimalesf"{0.94:.0%}""94%"
,separador de milesf"{1000000:,}""1,000,000"
>10alinear a la derecha en 10 caracteresf"{'hola':>10}"" hola"

Usarás .2f la mayoría de las veces: cada vez que muestres un decimal y quieras un número ordenado en lugar de una larga serie de dígitos. Todo lo demás en la tabla está ahí cuando lo necesites. Puedes poner cualquier variable, aritmética o llamada a método dentro de {}.

.2f y .0% cubren la mayoría del formato de visualización. Los especificadores de alineación (>, <, ^) producen salida tabular cuando se combinan con un ancho. El patrón general es {value:[align][width][.precision][type]}. Una vez que reconoces las piezas, cualquier spec es legible sin memorizar todas las combinaciones.

La misma spec puede significar cosas diferentes a tipos diferentes, porque cada tipo se formatea a sí mismo: f"{'hola':5}" rellena texto a la derecha mientras f"{42:5}" rellena un número a la izquierda, mismo :5, resultado opuesto. La bandera de conversión que vale la pena hacer un hábito es !r: ejecuta repr() antes de formatear, que envuelve cadenas de texto en comillas y convierte caracteres invisibles (tabulaciones, espacios finales, saltos de línea) en secuencias de escape visibles. Cuando la salida se ve sutilmente mal, intercambiar {value} por {value!r} es la forma más rápida de ver qué hay realmente ahí.

Junof-strings Pon f antes de la comilla de apertura, luego envuelve cualquier variable, suma o llamada a método en {} y Python deja el resultado cuando se ejecuta la línea. Una coma dentro de las llaves controla el aspecto: :.2f para dos lugares decimales es en la que te apoyarás. Mucho más limpio que pegar texto con +.
Junof-stringsf"..." evalúa cualquier expresión en {} y deja el resultado directamente, sin str() necesario. Después de una coma viene la especificación de formato: :.2f, :,, :>10 y amigos, todos siguiendo {value:[align][width][.precision][type]}. Aprende las partes una vez y puedes leer cualquier spec sin memorizarlas.
Junof-strings Cada {} llama al `__format__` de su propio valor, así que la especificación después de la coma significa lo que ese tipo decide, por eso :5 rellena texto y números en direcciones opuestas. La bandera a conservar es !r: muestra un valor de la manera que lo escribirías, por lo que el espaciado extraviado y otra basura invisible saltan en el momento en que la salida se ve mal.

Cadenas multilínea

Para escribir una cadena de texto que abarque más de una línea, usa comillas triple: tres " al principio y tres al final. Python preserva todos los saltos de línea y espaciado exactamente como los escribiste.

Las cadenas de texto entre comillas triples preservan todo espaciado en blanco y saltos de línea literalmente. Son estándar para bloques de texto largo como plantillas de correo electrónico y consultas SQL, y para docstrings: la documentación en línea colocada al inicio de un cuerpo de función o clase.

Una cadena de texto entre comillas triples mantiene cada carácter exactamente, incluyendo los espacios iniciales en cada línea, que es la trampa: indenta el literal para coincidir con tu código y esa indentación aterriza dentro del texto. Cuando es la primera declaración en una función, clase o módulo, Python la mantiene como el docstring de ese objeto (la documentación que help() muestra para él), así que la convención es poner un resumen breve allí. Para indentar un bloque entre comillas triples para coincidir con sus alrededores sin que la indentación se filtre al valor, elimínalo en tiempo de ejecución con textwrap.dedent(). Triple ''' y """ funcionan igual; """ es la convención.

python
message = """
Estimado Juan,

Gracias por tu pedido.

Saludos cordiales,
El Equipo
"""
JunoCadenas multilínea Tres comillas al final dejan una cadena de texto ejecutada a lo largo de varias líneas, y Python mantiene cada salto de línea y espacio exactamente como los tipieaste. Recurre a ellas siempre que tengas un bloque de texto, como un mensaje o una plantilla, que no quepa cómodamente en una línea.
JunoCadenas multilínea Las comillas triples preservan saltos de línea y espaciado textualmente, así que se adaptan a plantillas de correo electrónico, SQL y cualquier bloque largo. También es cómo funcionan los docstrings: una cadena de texto entre comillas triples en la parte superior de una función o clase se convierte en su documentación en línea. Observa la indentación, ya que los espacios que agregas para alinearla terminan dentro del texto.
JunoCadenas multilínea Todo dentro de comillas triples se mantiene literalmente, espaciado inicial incluido, que es la trampa: indenta el literal para coincidir con tu código y esa indentación aterriza en el valor. Coloca una breve en la parte superior de una función o clase y se convierte en el docstring que help() muestra. Cuando la necesitas indentada en la fuente pero limpia en el valor, pásala a través de textwrap.dedent().

Secuencias de escape

Algunos caracteres son difíciles de escribir directamente dentro de una cadena de texto. Python usa secuencias de escape: una barra invertida seguida de una letra que representa algo. Las dos que usarás constantemente son \n para una nueva línea y \t para una tabulación.

Las secuencias de escape te permiten incrustar caracteres que de otra manera romperían la sintaxis o no pueden ser tipieados directamente. Las que usarás: \n (salto de línea), \t (tabulación), \\ (una barra invertida literal), \" y \' (comillas dentro de una cadena con delimitador coincidente). Las rutas de Windows requieren barras invertidas, que chocan con el procesamiento de escape. Prefija con r para deshabilitarlo.

Más allá del \n y \t cotidianos, Python admite escapes Unicode para caracteres que no puedes escribir directamente: \uXXXX y \UXXXXXXXX nombran un carácter por su número, y \N{name} lo nombra en palabras, como \N{GREEK SMALL LETTER ALPHA}. El que hay que alcanzar en código real es la cadena cruda, escrita r"...", que desactiva el manejo de escape por completo y pasa cada barra invertida sin cambios. Úsala para rutas de Windows y para patrones de expresiones regulares, donde las barras invertidas están destinadas a ese consumidor en lugar de a Python, y donde olvidar r produce patrones que coinciden silenciosamente con lo incorrecto.

SecuenciaCarácter
\nSalto de línea
\tTabulación
\\Barra invertida literal
\"Comilla doble
\'Comilla simple
python
print("Línea uno\nLínea dos")        # dos líneas de salida
print("Nombre:\tJuan")              # Nombre:   Juan
path = r"C:\Usuarios\Juan\Documentos" # cadena cruda, sin procesamiento de escape
JunoSecuencias de escape Una barra invertida dentro de una cadena de texto significa "lee el siguiente carácter especialmente": \n comienza una nueva línea, \t inserta una tabulación, \\ es una barra invertida real. Esos dos, \n y \t, son los que realmente escribirás. Coloca una r antes de la comilla y las barras invertidas vuelven a ser simples, útil para rutas de Windows.
JunoSecuencias de escape\n, \t, \\ y \" cubren los escapes cotidianos. El que evita dolores de cabeza: una cadena de texto cruda, r"...", desactiva el procesamiento de escape para que cada barra invertida permanezca literal. Úsala para rutas de Windows y patrones de regex, donde las barras invertidas están destinadas a algo distinto de Python.
JunoSecuencias de escape Pasado \n y \t hay escapes Unicode como \N{name}, pero el caballo de batalla es la cadena de texto cruda r"...", que pasa cada barra invertida sin tocar. Recurre a ella en patrones de regex y rutas de Windows, ya que olvidarla da un patrón que coincide silenciosamente con lo incorrecto en lugar de un error que te diga.

Verificación del contenido de cadena de texto

Python tiene métodos que responden preguntas de sí/no sobre lo que contiene una cadena de texto. Devuelven True o False. El más útil al principio: isdigit() te permite verificar si una cadena de texto es solo números antes de convertirla, para que puedas evitar un fallo en entrada inesperada.

Los métodos is* cada uno prueban una propiedad específica de toda la cadena de texto y devuelven True solo si cada carácter satisface la condición. Su uso principal es validación de entrada: verificar antes de convertir para evitar un fallo en entrada inesperada. isdigit() antes de int() es el patrón clásico, una alternativa a atrapar el ValueError cubierto en el capítulo Archivos y excepciones.

Estas verificaciones preguntan "¿es cada carácter de este tipo?" en todo Unicode, no solo en las letras ASCII simples y dígitos. Eso significa que "2".isdigit() es True para el dos superíndice además del "2" ordinario, que puede dejar pasar entrada sorprendente en una verificación de validación. Cuando significa estrictamente los dígitos 0 a 9, combina s.isascii() and s.isdigit(). isnumeric() es aún más amplio, contando fracciones y otros caracteres con valor numérico, así que recurre a la verificación más estrecha que coincida con lo que realmente aceptas en lugar de la primera que se vea correcta.

python
"42".isdigit()       # True
"hola".isalpha()    # True
"hola42".isalnum()  # True
"   ".isspace()      # True
"Hola".islower()    # False
"HOLA".isupper()    # True
JunoVerificación del contenido de cadena de texto Los métodos is* responden preguntas de sí o no y devuelven True solo cuando cada carácter se ajusta. El que usarás primero: llama isdigit() antes de int() para asegurarte de que el texto realmente sea un número, para que la entrada extraña no te hunda.
JunoVerificación del contenido de cadena de texto Cada método is* es True solo si toda la cadena de texto pasa, lo que los hace útiles para validar entrada antes de convertir. isdigit() antes de int() es la guardia clásica. Recuerda que está probando toda la cadena, así que una cadena vacía devuelve False para todos.
JunoVerificación del contenido de cadena de texto Estas verificaciones abarcan todo Unicode, no ASCII simple, así que isdigit() pasa superíndices y otros caracteres numéricos que no tenías la intención de aceptar. Cuando significa los dígitos `0` a `9`, empareja: s.isascii() and s.isdigit(). Elige la verificación más estrecha que coincida con tu entrada real en lugar de la primera que se vea cercana.

En la práctica

Elimina espaciado en blanco, normaliza mayúsculas, luego extrae lo que necesitas. Esta secuencia maneja casi cualquier texto proporcionado por el usuario:

python
raw_input = "  Juan@Example.COM  "
email = raw_input.strip().lower()   # "juan@example.com"

at_pos = email.find("@")
username = email[:at_pos]
domain = email[at_pos + 1:]

print(f"Usuario:   {username}")    # "juan"
print(f"Dominio: {domain}")      # "example.com"

Construyendo una URL a partir de piezas e inmediatamente validándola y analizándola:

python
BASE_URL = "https://api.example.com"
version = "v2"
resource = "users"
user_id = 42

url = f"{BASE_URL}/{version}/{resource}/{user_id}"
# "https://api.example.com/v2/users/42"

parts = url.split("://")              # ["https", "api.example.com/v2/users/42"]
protocol = parts[0]                   # "https"
secured = url.startswith("https")
domain = parts[1].split("/")[0]       # "api.example.com"

print(f"Protocolo : {protocol}")
print(f"Seguro   : {secured}")
print(f"Dominio   : {domain}")

Analizando una línea de registro estructurado usando find(), corte y alineación de f-string:

python
log_entry = "[2024-01-15 09:42:11] ERROR: Archivo no encontrado: report.csv"

timestamp = log_entry[1:20]
rest = log_entry[22:]                # "ERROR: Archivo no encontrado: report.csv"
colon_pos = rest.find(":")
level = rest[:colon_pos]             # "ERROR"
message = rest[colon_pos + 2:]       # "Archivo no encontrado: report.csv"

print(f"[{timestamp}] {level:>8}: {message}")
# [2024-01-15 09:42:11]    ERROR: Archivo no encontrado: report.csv

find() ubica el límite, el corte extrae las partes, y la especificación de formato >8 alinea a la derecha la etiqueta de severidad para que las columnas permanezcan consistentes cuando los nombres de nivel difieren en longitud.

Referencia de métodos

MétodoQué hace
.lower() / .upper()Convertir a minúsculas / mayúsculas
.title() / .capitalize()Capitalizar cada palabra / solo la primera
.strip() / .lstrip() / .rstrip()Eliminar espaciado en blanco circundante
.find(sub)Índice de primera coincidencia, o -1
.count(sub)Cuántas veces aparece sub
.startswith(s) / .endswith(s)Verificación de prefijo / sufijo
.replace(old, new)Reemplazar ocurrencias
.split(sep)Dividir en una lista
sep.join(iterable)Unir elementos en una cadena de texto
.isdigit() / .isalpha() / .isalnum()Verificaciones de tipo de carácter