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

Cadenas de texto

El texto aparece en casi todos los programas que escribes. Nombres, mensajes, puntuaciones, etiquetas. En Python, cualquier trozo de texto se llama cadena de texto: cualquier valor que envuelvas entre comillas. Simples o dobles, ambas funcionan igual.

Las cadenas de texto son el tipo de dato principal de Python para trabajar con texto. Llevan 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 de estilo.

str está en cada frontera del sistema: entrada/salida de terminal, contenidos de archivos, respuestas de red, datos serializados. Es el tipo de secuencia Unicode de Python inmutable (no se puede cambiar después de crearse). Ambos estilos de comillas producen el mismo objeto, así que la elección entre ellos es puramente de estilo.

python
greeting = "Hello, world"
username = 'carlos'

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

La convención de la comunidad es 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 herramientas como Black y Ruff lo refuerzan automáticamente. La única razón manual para cambiar es evitar una barra invertida de escape cuando el contenido contiene el delimitador:

python
note = "It's a great day"      # apóstrofo dentro, usa comillas dobles
message = 'She said "hello"'   # comillas dobles dentro, usa comillas simples
escaped = "She said \"hello\""  # o escapa con una barra invertida

Inmutabilidad

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

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

Los objetos str son inmutables, lo que significa que su contenido está fijado una vez creado y nada puede escribir en ellos. Esto da a las cadenas dos propiedades que realmente usas: son hasheables (un valor cuyo contenido nunca cambia se puede archivar por ese contenido, lo que permite que una cadena sirva como clave de diccionario o miembro de conjunto), y es seguro pasarlas entre nombres sin que alguien las copie, ya que nadie puede cambiar una cadena compartida por debajo tuyo.

python
name = "alice"
name = name.upper()   # "ALICE" es una cadena nueva; "alice" 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 = "alice"
name[0] = "A"   # 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 directamente la limitación:

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

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

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

JunoInmutabilidad Una cadena nunca cambia una vez que existe. Cualquier cosa que parezca editarla te devuelve una cadena nueva en su lugar, así que asigna el resultado o se desvanece. La que me atrapó al principio: name[0] = "A" no funciona, lanza un TypeError.
JunoInmutabilidad Ningún método de cadena edita en su lugar, cada uno devuelve una cadena nueva y deja la original sola. Entonces name.upper() por sí solo no sirve de mucho, tienes que asignarlo. Y name[0] = "A" lanza TypeError, no hay intercambio de caracteres en su lugar.
JunoInmutabilidad La inmutabilidad es lo que hace que las cadenas sean hasheables, así que funcionan como claves de dict, y es seguro compartirlas sin copiar. Caída práctica: asigna el resultado de cada método transformador, ya que ninguno toca el original. Para una edición posicional, corta alrededor del lugar y reconstruye, ya que la asignación de items siempre lanza TypeError.

Indexación y corte

Cada carácter en una cadena 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 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 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 diferente: los límites fuera de rango se fijan silenciosamente a lo que existe, así que un corte nunca puede lanzar IndexError. Esa diferencia es la práctica a tener en cuenta: el acceso por índice es estricto, el corte es tolerante.

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 sin conocer su largo exacto.

Los índices negativos se envuelven: -1 es len(s) - 1, -2 es len(s) - 2. Muy útil para acceso anclado al final cuando no quieres calcular el largo manualmente. Un índice negativo que va fuera de rango aún lanza IndexError, igual que uno positivo.

Un índice negativo se convierte a len(s) + i antes de la verificación de límites, así que -1 termina en el último carácter y -2 en el anterior. Ir fuera de rango lanza IndexError de cualquier forma, positivo o negativo: solo el corte lo perdona, el indexado plano 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" (copia de toda la cadena)
print(word[::2])   # "Pto"    (cada segundo carácter)
print(word[::-1])  # "nohtyP" (invertida)

Tres patrones a alcanzar más frecuentemente: 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. Se ve raro 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 fija los índices fuera de rango silenciosamente, así que word[100:] en una cadena corta devuelve "" en lugar de fallar. El argumento step controla el salto: word[::2] toma cada otro carácter, word[::-1] recorre en orden inverso.

En s[start:stop:step], cualquier parte que dejes fuera por defecto es "el final natural para la dirección en que vas", no a un 0 y len() fijos. Con un step positivo significa inicio-a-fin; con un step negativo se invierte, así que start se convierte en el último carácter y stop corre fuera del frente. Por eso s[::-1] recorre 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 empiezan 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, que se ve extraño la primera vez y luego lo usas por 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 digna de 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 plano es estricto y lanza IndexError fuera de rango, el corte es tolerante y se ajusta a lo que existe, así que word[100:] devuelve "" en lugar de lanzar. Deja una parte de corte fuera y por defecto es el final natural para la dirección del step, que es exactamente por qué word[::-1] invierte sin límites escritos. Alcanza un corte cuando preferirías no fallar en una entrada vacía o corta.

Métodos esenciales de cadenas

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

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

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

Mayúsculas y minúsculas

python
text = "Hello, World"

text.lower()       # "hello, world"
text.upper()       # "HELLO, WORLD"
text.title()       # "Hello, World"  (cada palabra capitalizada)
text.capitalize()  # "Hello, world"  (solo la primera palabra)

lower() y upper() son los dos que usarás más. lower() es particularmente útil cuando comparas texto: "Alice" y "alice" se convierten en la misma cosa una vez que llamas .lower() en ambos lados.

lower() es el paso de normalización estándar antes de 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". Trátalo como formato solo para pantalla.

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

Espacios en blanco

python
text = "  hello  "

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

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

strip() elimina todo espacio en blanco inicial y final: espacios, tabulaciones, y saltos de línea. Las variantes direccionales te dejan limpiar solo un lado, útil para eliminar un salto de línea final sin tocar la indentación. Las tres aceptan un argumento de caracteres opcional para eliminar caracteres específicos en su lugar.

Sin argumento, strip() elimina todo tipo de espacio en blanco de ambos extremos, incluyendo espacio en blanco no ASCII, no solo el espacio plano. 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. "xxhelloxx".strip("x") devuelve "hello", 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 = "Hello, world"

text.find("world")         # 7
text.find("Python")        # -1  (no encontrado)
text.count("l")            # 3
text.startswith("Hello")   # True
text.endswith("world")     # True

find() devuelve la posición donde un trozo de texto comienza dentro de tu cadena. Si no está ahí, devuelve -1. Usa startswith() y endswith() cuando solo te importa 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 uno aceptan una tupla de cadenas, así 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 ahí, 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 prefieren sobre una verificación find() o in para ese trabajo.

Reemplazo

python
text = "Hello, world"

text.replace("world", "Python")   # "Hello, Python"
text.replace("l", "L")            # "HeLLo, worLd"  (todas las ocurrencias)
text.replace("l", "L", 1)         # "HeLlo, world"  (solo la primera)

replace() intercambia cada ocurrencia de un trozo de texto por otro y te devuelve una cadena nueva. 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 count limita cuántas se reemplazan. Ya que devuelve una cadena nueva, las llamadas se pueden encadenar: text.replace("a", "A").replace("e", "E") aplica ambas sustituciones en secuencia.

replace() coincide una subcadena literal, no un patrón, así que no hace regex y trata cada carácter en el argumento como él 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 count limita cuántas reemplaza, y ya que cada llamada devuelve una cadena nueva puedes encadenarlas: text.replace(",", "").replace(" ", "_").

División y unión

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

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

split(sep) escanea de izquierda a derecha, dividiéndose en cada ocurrencia no superpuesta de sep. Sin argumento usa un algoritmo diferente: se divide en cualquier corrida de espacio en blanco y elimina el espacio en blanco inicial y final del resultado. rsplit(sep, n) se divide desde la derecha, útil para aislar el último segmento de una ruta con puntos o un identificador con namespace.

python
csv_row = "Carlos,28,México"
parts = csv_row.split(",")     # ["Carlos", "28", "México"]

"  hello   world  ".split()   # ["hello", "world"]

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

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

python
words = ["Hello", "world"]

" ".join(words)    # "Hello world"
", ".join(words)   # "Hello, world"
"".join(words)     # "Helloworld"

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 con nada entre.

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

join() recorre las piezas una vez, calcula el tamaño total, asigna el resultado una sola vez, y escribe todo en. Construir la misma cadena con + repetido en un bucle es la forma cara: porque las cadenas no pueden cambiar, cada + asigna una cadena fresca y copia todo lo que hay hasta ahora en ella, así que el costo crece con el cuadrado del número de piezas. En un puñado de cadenas nadie lo nota, pero en unos pocos 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 en un bucle.

JunoMétodos esenciales de cadenas Cada uno devuelve una cadena nueva, así que asigna el resultado o se va. El puñado al que alcanzarás diariamente: .lower() y .upper() para mayúsculas/minúsculas, .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 y volver a armarla.
JunoMétodos esenciales de cadenas Todos devuelven una cadena nueva, ninguno muta, así que encadénalos o asígnalos. Mantén las trampas derechas: .strip("x") toma un conjunto de caracteres para recortar, no un prefijo, y .split() sin argumento colapsa corridas de espacio en blanco. Para ensamblar muchas piezas, construye una lista y sep.join() la.
JunoMétodos esenciales de cadenas 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 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() solo como pantalla ya que echa a perder las contracciones.

f-strings

Las f-strings incrustan valores directamente dentro de texto. Pon f antes de la comilla de apertura, luego envuelve cualquier variable o expresión entre llaves. Python lo llena cuando el código se ejecuta. También puedes añadir 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. Un dos puntos dentro de las llaves introduce una especificación de formato: una sintaxis compacta para controlar decimales, alineación, y formato de números.

Cada {} en una f-string termina llamando al método __format__ propio del valor (un dunder, el método de doble guion bajo que Python llama detrás de escenas cuando formatea un valor), pasando lo que escribiste después del 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 debes mantener, porque muestra un valor de la forma que lo escribirías en código, comillas y escapes incluidos, que se muestra en la práctica abajo.

python
name = "Carlos"
score = 94.5

print(f"Hello, {name}!")           # "Hello, Carlos!"
print(f"Score: {score:.1f}%")      # "Score: 94.5%"
print(f"2 + 2 = {2 + 2}")          # "2 + 2 = 4"
print(f"Name: {name.upper()}")     # "Name: CARLOS"

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

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

Usarás .2f la mayoría: cada vez que muestres un decimal y quieras un número ordenado en lugar de una larga corrida de dígitos. Todo lo demás en la tabla está ahí cuando lo necesitas. 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 especificación es legible sin memorizar todas las combinaciones.

La misma especificación puede significar cosas diferentes para diferentes tipos, porque cada tipo se formatea a sí mismo: f"{'hola':5}" rellena texto a la derecha mientras que f"{42:5}" rellena un número a la izquierda, mismo :5, resultado opuesto. La bandera de conversión digna de hábito es !r: ejecuta repr() antes de formatear, lo que envuelve cadenas entre 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 suelta el resultado cuando la línea se ejecuta. Un dos puntos dentro de las llaves controla el aspecto: :.2f para dos decimales es el que usarás. Mucho más limpio que pegar texto con +.
Junof-stringsf"..." evalúa cualquier expresión en {} y deja el resultado directamente, no se necesita str(). Después de dos puntos viene la especificación de formato: :.2f, :,, :>10 y compañía, todo siguiendo {value:[align][width][.precision][type]}. Aprende las piezas una vez y puedes leer cualquier especificación sin memorizarlas.
Junof-strings Cada {} llama al __format__ propio del valor, así que la especificación después del dos puntos significa lo que ese tipo decida, que es por qué :5 rellena texto y números en direcciones opuestas. La bandera a mantener es !r: muestra un valor de la forma que lo escribirías, así que el espacio extraviado y otras cosas invisibles saltan a la vista en el momento en que la salida se ve mal.

Cadenas multilínea

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

Las cadenas con comillas triples preservan todo el espacio en blanco y los saltos de línea literalmente. Son estándar para bloques de texto largo como plantillas de correo 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 con 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 termina 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 corto ahí. Para indentar un bloque con comillas triples para que coincida con sus alrededores sin que la indentación se filtre en el valor, despójala en tiempo de ejecución con textwrap.dedent(). Tres ''' y """ funcionan igual; """ es la convención.

python
message = """
Dear Carlos,

Thank you for your order.

Best regards,
The Team
"""
JunoCadenas multilínea Tres comillas al final de cada final permiten que una cadena corra a través de varias líneas, y Python mantiene cada salto de línea y espacio exactamente como los escribiste. Alcanza por ellas cada vez 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 espacios al pie de la letra, así que se adaptan a plantillas de correo, SQL, y cualquier bloque largo. También es cómo funcionan los docstrings: una cadena con comillas triples en el tope de una función o clase se convierte en su documentación en línea. Vigila la indentación, ya que los espacios que añades para alinearla terminan dentro del texto.
JunoCadenas multilínea Todo dentro de comillas triples se mantiene literalmente, el espacio en blanco inicial incluido, que es la trampa: indenta el literal para que coincida con tu código y esa indentación termina en el valor. Pon una corta en el tope de una función o clase y se convierte en el docstring que help() muestra. Cuando necesites que esté indentada en la fuente pero limpia en el valor, ejecútala a través de textwrap.dedent().

Secuencias de escape

Algunos caracteres son difíciles de escribir directamente dentro de una cadena. 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 forma romperían la sintaxis o no pueden ser escritos directamente. Las que alcanzará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á de los cotidianos \n y \t, Python soporta 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 con palabras, como \N{GREEK SMALL LETTER ALPHA}. El que alcanzarás en código real es la cadena cruda, escrita r"...", que desactiva el manejo de escape completamente y pasa cada barra invertida sin cambios. Úsala para rutas de Windows y para patrones de expresión regular, donde las barras invertidas están destinadas a ese consumidor en lugar de a Python, y donde olvidar r produce patrones que silenciosamente coinciden con la cosa incorrecta.

SecuenciaCarácter
\nSalto de línea
\tTabulación
\\Barra invertida literal
\"Comilla doble
\'Comilla simple
python
print("Line one\nLine two")        # dos líneas de salida
print("Name:\tCarlos")             # Name:   Carlos
path = r"C:\Users\Carlos\Documents" # cadena cruda, sin procesamiento de escape
JunoSecuencias de escape Una barra invertida dentro de una cadena significa "lee el siguiente carácter especialmente": \n comienza una línea nueva, \t inserta una tabulación, \\ es una barra invertida real. Esas dos, \n y \t, son las que realmente escribirás. Pon una r antes de la comilla y las barras invertidas vuelven a ser planas, útil para rutas de Windows.
JunoSecuencias de escape\n, \t, \\, y \" cubren los escapes cotidianos. La que salva dolores de cabeza: una cadena cruda, r"...", apaga el procesamiento de escape para que cada barra invertida se quede literal. Úsala para rutas de Windows y patrones regex, donde las barras invertidas están destinadas a algo otro que Python.
JunoSecuencias de escape Pasado \n y \t hay escapes Unicode como \N{name}, pero el caballo de carga es la cadena cruda r"...", que pasa cada barra invertida sin tocar. Alcánzala en patrones regex y rutas de Windows, ya que olvidarla da un patrón que silenciosamente coincide con la cosa incorrecta en lugar de un error que te lo dice.

Verificar contenidos de cadenas

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

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

Estas verificaciones preguntan "¿es cada carácter de este tipo?" a través de todo Unicode, no solo letras y dígitos ASCII planos. Eso significa que "2".isdigit() es True para el dos superíndice así como para el "2" ordinario, lo que puede dejar entrada sorprendente pasar un control de validación. Cuando quieres 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 alcanza la verificación más estrecha que coincida con lo que realmente aceptas en lugar de la primera que se ve correcta.

python
"42".isdigit()       # True
"hello".isalpha()    # True
"hello42".isalnum()  # True
"   ".isspace()      # True
"Hello".islower()    # False
"HELLO".isupper()    # True
JunoVerificar contenidos de cadenas Los métodos is* responden preguntas sí-o-no y devuelven True solo cuando cada carácter se ajusta. El que usarás primero: llama isdigit() antes de int() para asegurate de que el texto realmente es un número, así que entrada rara no te cuelga.
JunoVerificar contenidos de cadenas Cada método is* es True solo si la cadena entera pasa, lo que los hace útiles para validar entrada antes de convertir. isdigit() antes de int() es la guardía clásica. Recuerda que está probando la cadena entera, así que una cadena vacía devuelve False para todas.
JunoVerificar contenidos de cadenas Estas verificaciones abarcan todo Unicode, no ASCII plano, así que isdigit() pasa superíndices y otros caracteres numéricos que no querías aceptar. Cuando quieres los dígitos 0 a 9, emparéjalos: 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 ve cercana.

En la práctica

Elimina espacio en blanco, normaliza mayúsculas/minúsculas, luego extrae lo que necesitas. Esta secuencia maneja casi cualquier texto provisto por usuario:

python
raw_input = "  [email protected]  "
email = raw_input.strip().lower()   # "[email protected]"

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

print(f"User:   {username}")    # "carlos"
print(f"Domain: {domain}")      # "example.com"

Construir una URL desde partes e inmediatamente validar y analizarla:

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"Protocol : {protocol}")
print(f"Secure   : {secured}")
print(f"Domain   : {domain}")

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

python
log_entry = "[2024-01-15 09:42:11] ERROR: File not found: report.csv"

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

print(f"[{timestamp}] {level:>8}: {message}")
# [2024-01-15 09:42:11]    ERROR: File not found: 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 así que las columnas se quedan consistentes cuando los nombres de nivel difieren en largo.

Referencia de métodos

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