Cadenas de texto (String)
Una cadena de texto o string es una secuencia de caracteres.
Este tipo de datos es inmutable. Un tipo de dato inmutable es aquel cuyo valor no puede modificarse después de ser creado; cualquier "cambio" genera un nuevo objeto en memoria.
Puedes acceder a los caracteres de uno en uno con el operador corchete:
fruta = 'banana'
letra = fruta[1]
La segunda sentencia extrae el carácter en la posición del índice 1 de la variable fruta y lo asigna a la variable letra.
La expresión entre corchetes se llama índice. El índice indica qué carácter de la secuencia quieres. Pero podrías no obtener lo que esperas:
print(letra) # Imprime: a
Así que b es la letra con índice 0 de banana, a es la letra con índice 1, y n es la que tiene índice 2, etc.
Puedes usar cualquier expresión, incluyendo variables y operadores, como un índice, pero el valor del índice tiene que ser siempre un entero:
letra = fruta[1.5] # TypeError: string indices must be integers
Inmutabilidad de una cadena
Puede ser tentador utilizar el operador [] en el lado izquierdo de una asignación, con la intención de cambiar un carácter de una cadena. Por ejemplo:
saludo = 'hola, mundo!'
saludo[0] = 'H' # TypeError: 'str' object does not support item assignment
El objeto en este caso es la cadena y el ítem es el carácter que intentamos asignar. Por el momento, un objeto es lo mismo que un valor, pero vamos a redefinir esto más adelante. Un ítem es uno de los valores de una secuencia.
La razón por la que ocurre este error es que las cadenas son inmutables, lo que significa que no puedes modificar una cadena existente. Lo mejor que puedes hacer es crear una nueva cadena que sea una variación de la original:
saludo = 'hola, mundo!'
nuevo_saludo = 'H' + saludo[1:]
print(nuevo_saludo) # Imprime: Hola, mundo!
Este ejemplo concatena una nueva letra a una parte de saludo. Esto no tiene efecto sobre la cadena original.
Tamaño de una cadena
len es una función interna que devuelve el número de caracteres de una cadena:
fruta = 'banana'
len(fruta) # Imprime: 6
Para obtener la última letra de una cadena, podrías estar tentado a probar algo como esto:
tamaño = len(fruta)
ultima = fruta[tamaño] # IndexError: string index out of range
La razón de que haya un IndexError es que ahí no hay ninguna letra en "banana" con el índice 6. Puesto que empezamos a contar desde cero, las seis letras están enumeradas de 0 a 5. Para obtener el último carácter, tienes que restar 1 a tamaño.
ultima = fruta[tamaño-1]
print(ultima) # Imprime: a
Alternativamente, puedes usar índices negativos, los cuales cuentan hacia atrás desde el final de la cadena. La expresión fruta[-1] devuelve la última letra, fruta[-2] la penúltima letra, y así sucesivamente.
Recorrer una cadena: for
Muchos de los cálculos requieren procesar una cadena carácter por carácter. Frecuentemente comienzan desde el inicio, seleccionando cada carácter presente, haciendo algo con él, y continuando hasta el final. Este patrón de procesamiento se llama recorrer. Una forma de escribir el recorrido es con el bucle while:
indice = 0
while indice < len(fruta):
letra = fruta[indice]
print(letra)
indice = indice + 1
Este bucle recorre la cadena e imprime cada letra de una en una. La condición del bucle es indice < len(fruta), así que cuando indice es igual al tamaño de la cadena, la condición es falsa, y el código del bucle no se ejecuta. El último carácter es el que tiene el índice len(fruta)-1, que es el último carácter de la cadena.
For
En Python, un bucle for se usa para iterar sobre elementos de una secuencia, como listas, tuplas, diccionarios o cadenas de texto. Un bucle for se trata de una estructura iterativa, al igual que lo es while.
Cuando se usa un bucle for con una cadena de texto, Python itera sobre cada carácter individual de la cadena, uno por uno.
for caracter in cadena:
# Haz algo con el carácter
cadenaes la cadena de texto que quieres iterar.caracteres una variable que toma el valor de cada carácter de la cadena en cada iteración.
Veamos un ejemplo donde iteramos sobre cada carácter de una cadena y lo imprimimos:
cadena = "Python"
for caracter in cadena:
print(caracter)
"""
Salida:
P
y
t
h
o
n
"""
En este ejemplo, el bucle for recorre la cadena "Python", y en cada iteración, caracter toma el valor de cada uno de los caracteres de la cadena, que se imprimen uno a uno.
Al igual que la cláusula while, podemos utilizar break, continue y else dentro de una iteración creada con for.
Segmentación de una cadena
El slicing en programación, especialmente en Python, es una técnica para extraer subcadenas o sublistas de una secuencia (como cadenas, listas o tuplas) usando índices. Permite tomar un rango de elementos especificando un inicio, un final y opcionalmente un paso, sin modificar la secuencia original.
Seleccionar una porción es similar a seleccionar un carácter:
s = 'Monty Python'
print(s[0:5]) # Imprime: Monty
print(s[6:12]) # Imprime: Python
El operador [n:m] retorna la parte de la cadena desde el "n-ésimo" carácter hasta el "m-ésimo" carácter, incluyendo el primero pero excluyendo el último.
En Python, cuando haces slicing en una cadena y el segundo índice es mayor que el tamaño de la cadena, Python no da error. En vez de eso, limita el índice al final de la cadena. Esto es porque el slicing es "tolerante" a índices fuera de rango.
cadena = "Python"
resultado = cadena[1:100]
print(resultado) # Imprime "ython"
Si omites el primer índice (antes de los dos puntos), la porción comienza desde el inicio de la cadena. Si omites el segundo índice, la porción va hasta el final de la cadena.
fruta = 'banana'
fruta[:3] # Imprime: 'ban'
fruta[3:] # Imprime: 'ana'
Si el primer índice es mayor o igual que el segundo, el resultado es una cadena vacía, representada por comillas:
fruta = 'banana'
fruta[3:3] # Imprime: ''
Una cadena vacía no contiene caracteres y tiene un tamaño de 0, pero fuera de eso es lo mismo que cualquier otra cadena.
Si utilizamos solo 2 puntos, lo que se hará es una copia completa de la cadena:
fruta = 'banana'
fruta[:] # Imprime: 'banana'
Slicing terciario
El slicing terciario, o slicing extendido, es una forma de añadir un tercer parámetro conocido como paso.
La sintaxis es la siguiente:
cadena[inicio:fin:paso]
Donde:
inicioes el índice donde comienza el slicing (incluido).fines el índice donde termina el slicing (excluido).pasoes el incremento entre los elementos tomados.
Ejemplos:
# Creamos una cadena de ejemplo
cadena = "abcdefghij"
# Obtenemos los elementos desde el índice 2 hasta el índice 7 con un paso de 2
resultado = cadena[2:7:2]
# [2:7] tomaría la cadena "cdefg"
# El paso 2 significa que tomamos de 2 en 2 (o saltamos 1) comenzando en el primero "ceg"
print(resultado) # Salida: "ceg"
# Obtenemos todos los elementos con un paso de 3
# [:] tomamos todos los elementos "abcdefghij"
# Tomamos cada 3 elementos (o saltamos 2) "adgj"
resultado = cadena[::3]
print(resultado) # Salida: "adgj"
Podemos utilizar este método para crear una nueva lista invertida de la siguiente manera:
letras = "abcd"
letras_invertidas = letras[::-1]
print(letras_invertidas) # Imprime: "dcba"
Comparación de cadenas
Los operadores de comparación funcionan en cadenas. Para ver si dos cadenas son iguales:
if palabra == 'banana':
print('Muy bien, bananas.')
Otras operaciones de comparación son útiles para poner palabras en orden alfabético:
if palabra < 'banana':
print('Tu palabra, ' + palabra + ', está antes de banana.')
elif palabra > 'banana':
print('Tu palabra, ' + palabra + ', está después de banana.')
else:
print('Muy bien, bananas.')
Python no maneja letras mayúsculas y minúsculas de la misma forma que la gente hace. Todas las letras mayúsculas van antes que todas las letras minúsculas.
Una forma común de manejar este problema es convertir cadenas a un formato estándar, como todas las minúsculas, antes de llevar a cabo la comparación.
Operador in
La palabra in es un operador booleano que toma dos cadenas y devuelve True si la primera cadena aparece como una subcadena de la segunda:
'a' in 'banana' # True
'semilla' in 'banana' # False
Repetición de una cadena
El operador * también funciona con cadenas: en lugar de multiplicar números, repite el contenido de la cadena tantas veces como indique el número entero con el que se multiplica. Esto se llama repetición de secuencia, porque no es exclusivo de las cadenas: funciona con cualquier tipo de secuencia (por ejemplo, también con listas).
separador = '-' * 20
print(separador) # Imprime: --------------------
saludo = 'Hola! ' * 3
print(saludo) # Imprime: Hola! Hola! Hola!
En el segundo ejemplo, el espacio final de 'Hola! ' forma parte de la cadena original, así que también se repite en cada copia.
Métodos de cadenas
Algunas de las funciones y métodos más utilizados para cadenas en Python se presentan a continuación. Tanto los métodos como las funciones siempre crean una nueva cadena, debido a que las cadenas son inmutables.
Minúsculas y mayúsculas
Existen varios métodos que permiten modificar las mayúsculas y minúculas de una cadena de texto:
str.upper(): convierte la cadena a mayúsculas.str.lower(): convierte la cadena a minúsculas.str.capitalize(): convierte la cadena a minúsculas excepto el primer caracter.str.title(): convierte la cadena a minúsculas excepto el primer caracter de cada palabra.
texto = "Bienvenido a Python"
texto.upper() # "BIENVENIDO A PYTHON"
texto.lower() # "bienvenido a python"
texto.capitalize() # "Bienvenido a python"
texto.title() # "Bienvenido A Python"
Eliminar espacios en blanco al inicio o final
Existen varios métodos para eliminar espacios en blanco:
str.strip(): elimina espacios al inicio y final de la cadena.str.lstrip(): elimina espacios al inicio (left).str.rstrip(): elimina espacios al final (right).
texto = " ¡Hola, mundo! "
texto.lstrip() # "¡Hola, mundo! "
texto.rstrip() # " ¡Hola, mundo!"
texto.strip() # "¡Hola, mundo!"
Buscar posición
str.find(subcadena) y str.index(subcadena) encuentran la posición de la primera aparición de una subcadena en la cadena.
texto = "Python es divertido"
posicion = texto.find("div")
Sustitución
str.replace(antiguo, nuevo) sustituye todas las ocurrencias de una subcadena con otra.
texto = "¡Hola, mundo!"
modificado = texto.replace("mundo", "Python") # "¡Hola, Python!"
Podemos realizar una sustitución por una cadena vacía para borrar una subcadena.
texto = "hola, mundo!"
modificado = texto.replace("o", "") # "hla, mund!"
Esta función admite un tercer argumento, str.replace(antiguo, nuevo, veces_reemplazo). Este tercer argumento indica cuántas veces se debe realizar la sustitución. Si este tiene el valor 1, solo se sustituirá la primera aparición.
texto = "hola, mundo!"
modificado = texto.replace("o", "ho") # "hola, mundo!"
Dividir
str.split(separador) divide la cadena en una lista de subcadenas utilizando el separador indicado.
texto = "Python es divertido"
palabras = texto.split(" ")
Comparar final
La función endswith(final) se utiliza para comprobar si una cadena termina con una subcadena. Devuelve verdadero si termina con la subcadena y falso en caso contrario.
cadena = "Hola mundo"
cadena.endswith("mundo") # True
Puedes utilizar endswith() para realizar tareas como comprobar si un archivo tiene cierta extensión, validar entradas de texto, entre otras cosas.