Tutorial

Como indexar e fatiar strings em Python 3

PythonDevelopment

Introdução

O tipo de dados string do Python é uma sequência composta por um ou mais caracteres individuais, que consistem em letras, números, caracteres de espaço em branco ou símbolos. Como uma string é uma sequência, ela pode ser acessada das mesmas maneiras que outros tipos de dados baseados em sequências o são, através da indexação e divisão.

Este tutorial ensinará como acessar strings através da indexação e dividir suas sequências de caracteres, e abordará alguns métodos de contagem e localização de caracteres.

Como as strings são indexadas

Assim como o tipo de dados lista, que possui itens que correspondem a um número de índice, cada um dos caracteres de uma string também correspondem a um número de índice, começando com o número de índice 0.

Para a string Sammy Shark! o detalhamento do índice se parece com isto:

S A M M y S h A r k !
0 1 2 3 4 5 6 7 8 9 10 11

Como se vê, o primeiro S começa no índice 0, e a string termina no índice 11 com o símbolo !

Também notamos que o caractere de espaço em branco entre Sammy e Shark também corresponde com seu próprio número de índice. Neste caso, o número de índice associado ao espaço em branco é 5.

O ponto de exclamação (!) também possui um número de índice associado a ele. Qualquer outro símbolo ou sinal de pontuação, como *#$&. ;?, também é um caractere e estaria associado ao seu próprio número de índice.

O fato de cada caractere em uma string Python possuir um número de índice correspondente nos permite acessar e manipular strings das mesmas maneiras que faríamos com outros tipos de dados sequenciais.

Acessando caracteres por um número de índice positivo

Ao referenciar os números de índice, podemos isolar um dos caracteres em uma string. Fazemos isso colocando os números de índice entre colchetes. Vamos declarar uma string e imprimi-la, e então chamar o número de índice entre colchetes:

ss = "Sammy Shark!"
print(ss[4])
Output
y

Quando nos referimos a um número de índice específico de uma string, o Python retorna o caractere que está naquela posição. Como a letra y está no índice de número 4 da string ss = "Sammy Shark!", quando imprimimos ss[4], recebemos y como resultado.

Os números de índice nos permitem acessar caracteres específicos dentro de uma string.

Acessando caracteres por um número de índice negativo

Se tivermos uma string longa e quisermos selecionar um item perto do final, também podemos contar de trás para frente a partir do final da string, começando no número de índice -1.

Para a mesma string Sammy Shark! o detalhamento do índice negativo se parece com isto:

S A M M y S h A r k !
-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

Ao usar números de índice negativos, podemos imprimir o caractere r, referindo-nos à sua posição de -3 no índice, desta forma:

print(ss[-3])
Output
r

O uso de números de índice negativos pode ser vantajoso para isolar um único caractere no final de uma string longa.

Dividindo strings

Também podemos chamar uma faixa de caracteres da string. Suponha que queiramos imprimir apenas a palavra Shark. Podemos fazer isso criando uma slice (fatia), que é uma sequência de caracteres dentro de uma string original. Com fatias, podemos chamar diversos valores de caracteres criando uma faixa de números de índice separados por dois pontos [x:y]:

print(ss[6:11])
Output
Shark

Ao construir uma fatia, como em [6:11], o primeiro número de índice é onde ela começa (com ele incluso), e o segundo número de índice é onde a fatia termina (sem ele incluso), razão pela qual no nosso exemplo acima o intervalo precisa terminar com o número de índice que ocorreria logo após a string terminar.

Ao dividir strings, estamos criando uma substring, que é essencialmente uma string que existe dentro de outra string. Quando chamamos ss[6:11], estamos chamando a substring Shark existente dentro da string Sammy Shark!.

Se quisermos incluir qualquer uma das extremidades de uma string, podemos omitir um dos números na sintaxe string[n:n]. Por exemplo, se quisermos imprimir a primeira palavra da string ss — “Sammy” — podemos fazer isso digitando:

print(ss[:5])
Output
Sammy

Fizemos isso omitido o número do índice antes dos dois pontos na sintaxe de fatia e incluindo apenas o número de índice após os dois pontos, que se referem ao final da substring.

Para imprimir uma substring que começa no meio de uma string e vai até o seu final, podemos incluir apenas o número de índice antes dos dois pontos, desta forma:

print(ss[7:])
Output
hark!

Ao incluir apenas o número de índice antes dos dois pontos, deixando o segundo número de índice fora da sintaxe, a substring será iniciada no caractere do número de índice chamado e irá até o final da string.

Também é possível usar números de índice negativos para dividir uma string. Conforme mostramos anteriormente, os números de índice negativos de uma string começam em -1 e vão sendo contados regressivamente até o início da string. Ao usar números de índice negativos, começamos com o número menor primeiro, uma vez que ele ocorre mais cedo na string.

Vamos usar dois números de índice negativos para dividir a string ss:

print(ss[-4:-1])
Output
ark

A substring “ark” é impressa a partir da string “Sammy Shark!” porque o caractere “a” ocorre na posição de número de índice -4 e o caractere “k” ocorre logo antes da posição de número de índice -1.

Especificando o deslocamento ao dividir strings

A divisão de strings pode aceitar um terceiro parâmetro, além dos dois números de índice. O terceiro parâmetro especifica o stride (deslocamento), que diz respeito a quantos caracteres devem ser pulados após o primeiro caractere ser recuperado da string. Até agora, omitimos o parâmetro stride e o Python utiliza o valor padrão do stride de 1, para que todos os caracteres entre dois números de índice sejam recuperados.

Vamos observar novamente o exemplo acima que imprime a substring “Shark”:

print(ss[6:11])
Output
Shark

Podemos obter os mesmos resultados incluindo um terceiro parâmetro com um deslocamento de 1:

print(ss[6:11:1])
Output
Shark

Assim, um deslocamento de 1 irá abranger todos os caracteres entre dois números de índice de uma fatia. Se omitirmos o parâmetro deslocamento, então o Python usará o padrão 1.

Se, ao invés disso, aumentarmos o deslocamento, veremos que os caracteres são ignorados:

print(ss[0:12:2])
Output
SmySak

Especificar o deslocamento de 2 como o último parâmetro na sintaxe do Python ss[0:12:2] ignora um caractere a cada dois. Vamos ver os caracteres que são impressos em vermelho:

Sammy Shark!!

Note que o caractere de espaço em branco no número de índice 5 também é ignorado com um deslocamento especificado de 2.

Se usarmos um número maior para nosso parâmetro de deslocamento, teremos uma substring significativamente menor:

print(ss[0:12:4])
Output
Sya

Especificar o deslocamento de 4 como o último parâmetro na sintaxe do Python ss[0:12:4] imprime apenas um a cada quatro caracteres. Mais uma vez, vamos ver os caracteres que são impressos em vermelho:

Sammy Shark!

Neste exemplo, o caractere de espaço em branco também é ignorado.

Como estamos imprimindo toda a string, podemos omitir os dois números de índice e manter os dois sinais de dois pontos dentro da sintaxe para alcançar o mesmo resultado:

print(ss[::4])
Output
Sya

Omitir os dois números de índice mantendo os dois pontos irá considerar a string inteira dentro do intervalo, ao mesmo tempo que adicionando um parâmetro final para o deslocamento especificará o número de caracteres a serem pulados.

Além disso, é possível indicar um valor numérico negativo para o stride, que podemos usar para imprimir a string original em ordem reversa se definirmos o deslocamento para -1:

print(ss[::-1])
Output
!krahS ymmaS

Os dois sinais de dois pontos sem parâmetro especificado incluirão todos os caracteres da string original, um deslocamento de 1 incluirá todos os caracteres sem pular nenhum, e o deslocamento negativo inverterá a ordem dos caracteres.

Vamos fazer isso novamente mas com um deslocamento de -2:

print(ss[::-2])
Output
!rh ma

Neste exemplo, ss[:-2], estamos lidando com a totalidade da string original, uma vez que nenhum número de índice foi incluído nos parâmetros e invertendo a string ao utilizar o deslocamento negativo. Além disso, por termos um deslocamento de -2, estamos ignorando um caractere a cada dois na string invertida:

! krahS[whitespace]ymmaS

O caractere de espaço em branco é impresso neste exemplo.

Ao especificar o terceiro parâmetro da sintaxe de fatia do Python, você está indicando o deslocamento da substring que está sendo gerada a partir da string original.

Métodos de contagem

Enquanto estamos pensando nos números de índice relevantes que correspondem a caracteres dentro de strings, vale a pena abordar alguns dos métodos que contam strings ou retornam números de índice. Isso pode ser útil para limitar o número de caracteres que gostaríamos de aceitar dentro de um formulário com entradas de usuário, ou comparar strings. Assim como outros tipos de dados sequenciais, as strings podem ser contadas com a utilização de vários métodos.

Vamos primeiro ver o método len(), que pode obter o comprimento de qualquer tipo de dados que seja uma sequência, ordenada ou não ordenada, incluindo strings, listas, tuplas e dicionários.

Vamos imprimir o comprimento da string ss:

print(len(ss))
Output
12

O comprimento da string “Sammy Shark!” é de 12 caracteres, incluindo o caractere de espaço em branco e o símbolo de ponto de exclamação.

Ao invés de usar uma variável, podemos também passar uma string diretamente para o método len():

print(len("Let's print the length of this string."))
Output
38

O método len() conta o número total de caracteres dentro de uma string.

Se quisermos contar o número de vezes que um caractere em particular ou uma sequência de caracteres aparece em uma string, fazemos isso com o método str.count(). Vamos trabalhar com nossa string ss = "Sammy Shark!" e contar o número de vezes que o caractere “a” aparece:

print(ss.count("a"))
Output
2

Podemos pesquisar por outro caractere:

print(ss.count("s"))
Output
0

Embora a letra “S” esteja na string, é importante lembrar que todo caractere possui distinção entre maiúsculas e minúsculas. Se quisermos pesquisar todas as letras em uma string desconsiderando se são maiúsculas ou minúsculas, podemos usar primeiro o método str.lower() para converter a string inteira para letras minúsculas. Leia mais sobre esse método em “Uma introdução aos métodos de string em Python 3.”

Vamos tentar o str.count() com uma sequência de caracteres:

likes = "Sammy likes to swim in the ocean, likes to spin up servers, and likes to smile."
print(likes.count("likes"))
Output
3

Na string likes, a sequência de caracteres equivalente a “likes” ocorre 3 vezes na string original.

Também podemos descobrir em qual posição um caractere ou sequência de caracteres ocorre em uma string. Podemos fazer isso com o método str.find(), e ele retornará a posição do caractere com base em seu número de índice.

Podemos verificar quando o primeiro “m” ocorre na string ss:

print(ss.find("m"))
Ouput
2

O primeiro caractere “m” ocorre na posição de índice 2 na string "Sammy Shark!” Podemos revisar as posições dos números de índice da string ss acima.

Vamos ver onde a primeira sequência de caracteres "likes” ocorre na string likes:

print(likes.find("likes"))
Ouput
6

A primeira ocorrência da sequência de caracteres "likes” começa na posição de número de índice 6, que é onde o caractere l da sequência likes está posicionado.

E se quisermos ver onde a segunda sequência de "likes” começa? Podemos fazer isso passando um segundo parâmetro ao método str.find(), que começará em um número de índice em particular. Assim, ao invés de começar no início da string vamos começar após o número de índice 9:

print(likes.find("likes", 9))
Output
34

Neste segundo exemplo que começa no número de índice 9, a primeira ocorrência da sequência de caracteres "likes” começa no número de índice 34.

Além disso, podemos especificar um final para o intervalo como um terceiro parâmetro. Assim como na divisão em fatias, podemos fazer isso contando de trás para frente usando um número de índice negativo:

print(likes.find("likes", 40, -6))
Output
64

Este último exemplo procura a posição da sequência "likes” entre os números de índice 40 e -6. Como o parâmetro final inserido é um número negativo, ele contará a partir do final da string original.

Os métodos de string len(), str.count() e str.find() podem ser usados para determinar o comprimento, contagens de caracteres ou sequências de caracteres, e o índice das posições dos caracteres ou sequências de caracteres dentro de strings.

Conclusão

A capacidade de chamar números de índice específicos das strings, ou uma fatia em particular de uma string oferece uma maior flexibilidade ao trabalhar com esse tipo de dados. Como as strings são um tipo de dados baseado em sequências, assim como as listas e tuplas, elas podem ser acessadas através da indexação e divisão em fatias.

Leia mais sobre a formatação de strings e métodos de strings para continuar aprendendo sobre as strings.

Creative Commons License