Saltar a contenido

Slicing

Hemos visto que el uso de índices con un string nos proporciona nuevas cadenas de un carácter. Pero ¿como obtener fragmentos con más caracteres a partir de un string? Realizando una operación de slicing.

En inglés, un slice es una porción o una rebanada de algo. Por ejemplo, en una pizzeria, podemos comprar pizzas enteras o slices.

Obtener un slice

Un slice se obtiene aplicando un doble índice:

FragmentoTexto.py
1
2
3
texto = 'Hola, que tal'
fragmento = texto[6:9]
print(fragmento)

Muestra:

que

Los dos índices se escriben separados por un símbolo :. El primero indica el primer carácter a tomar, y el segundo índice, el primer carácter a ignorar. En este ejemplo:

Carácter  Indice  Indice negativo
--------  ------  ---------------
H              o              -13
o              1              -12
l              2              -11
a              3              -10
coma           4               -9
espacio        5               -8
q              6               -7
u              7               -6
e              8               -5
espacio        9               -4
t             10               -3
a             11               -2
l             12               -1

indicamos que hay que coger caracteres desde la posición 6, y empezar a ignorar todo lo que a partir de la posición 9. Sería lo mismo que escribir:

fragmento = texto[-7:-4]

Comprobémoslo:

FragmentoTexto2.py
1
2
3
4
5
6
texto = "Hola, que tal"
fragmento = texto[6:9]
fragmento2 = texto[-7:-4]
comillas = '"'
print(comillas+fragmento+comillas)
print(comillas+fragmento2+comillas)

Muestra:

"que"
"que"

Indices fuera de rango

A diferencia de la indexación ordinaria, un índice fuera de rango no genera un error en una operación de slicing. Si por ejemplo, escribimos:

fragmento = texto[6:99]

la extracción se lleva a cabo y se detiene al llegar al final de la cadena.

Indices por omisión

En una operación de slicing, podemos omitir el primer índice, el segundo, o los dos a la vez. Pero no podemos omitir los dos puntos, porque indican que se trata de una operación de slicing:

  • si se omite el primer índice, se asume cero.
  • si se omite el segundo índice, se asume que la extracción se lleva hasta el final de la cadena
  • si se omiten ambos índices, se extrae la cadena completa

Por ejemplo:

FragmentoTexto2.py
1
2
3
4
5
6
7
8
texto = "Hola, que tal"
fragmento1 = texto[:6]
fragmento2 = texto[6:]
fragmento_total = texto[:]
comillas = '"'
print(comillas+fragmento1+comillas)
print(comillas+fragmento2+comillas)
print(comillas+fragmento_total+comillas)

Muestra:

"Hola, "
"que tal"
"Hola, que tal"

Las cadenas son inmutables

Una cadena de texto es un objeto que no se puede modificar. Supongamos que tenemos un texto en el que queremos cambiar el segundo carácter (índice 1). No podemos escribir:

ModificarCadena.py
1
2
3
texto = "Hola"
texto[1] = "a"
print(texto)

En la segunda sentencia obtendremos un error:

TypeError: 'str' object does not support item assignment

¿La solución? Obtener una nueva cadena completa, y asignársela a la variable, perdiendo el texto original:

ModificarCadena.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
texto = "Hola"

indice = 1
nuevo_caracter= "a"

nuevo_texto = texto[:indice]   # tomar los caracteres a la izquierda
nuevo_texto += nuevo_caracter  # sumar el nuevo carácter
indice += 1                    # desplazar el índice una posición
nuevo_texto += texto[indice:]  # añadir los caracteres de la derecha
texto = nuevo_texto

print(texto)

Lo que, al ejecutarse, muestra:

Hala