Manipulação de strings em Python


Introdução

Um tipo de dados bastante usado no dia a dia são as strings (ou cadeias de caracteres, ou sequências de caracteres). O tipo de dados string, ou str como é chamado em Python, provê várias operações úteis. Essas operações tornam Python uma linguagem bastante propícia para manipulação de textos.

Os exemplos abaixo ilustram o tipo de dados string e algumas operações a ele associadas.

# Imprimindo uma string.
s = "Olá, mundo!"
print(s)

# Tipo de uma string.
type(s)

# Tamanho de uma string.
len(s)

# Concatenação
print("Meu Brasil " + "brasileiro")

# Substitui uma substring por alguma outra coisa.
s1 = s.replace("mundo", "meu abacate")

print(s1)

# A string s começa com "Olá"?
print(s.startswith("Olá"))

# A string s termina com "mundo"?
print(s.endswith("mundo"))

# Quantas ocorrências da palavra "abacate" a string s1 possui?
print(s1.count("abacate"))
Olá, mundo!
<class 'str'>
11
Meu Brasil brasileiro
Olá, meu abacate!
True
False
1

Strings em Python são muito flexíveis e nos permitem executar as mais diversas operações de maneira simples. Vejamos mais exemplos:

# Como "capitalizar" (transformar a primeira letra da primeira palavra em maiúscula).
s = "ordem e progresso"
print(s.capitalize())

# Como verificar se uma string só possui números.
'12345'.isdigit()
'12345abc'.isdigit()

# Como verificar se uma string é alfanumérica (só possui letras e números).
'12345abc'.isalnum()
Ordem e progresso
True
False
True

Substrings em Python (Slicing)

Além das operações vistas acima, podemos acessar caracteres específicos de uma string em Python usando a notação [].

Neste esquema de acesso a caracteres de uma string, o primeiro caracter está no índice $0$, o segundo no índice $1$, e assim por diante, conforme ilustrado no exemplo abaixo.

s = "Olá, mundo!"
print(s[0])
print(s[2])
print(s[6])
'O'
'á'
'u'

No caso da string "Olá, mundo!", temos a seguinte associação entre índices e caracteres:

O l á ,   m u n d o !
0 1 2 3 4 5 6 7 8 9 10

Podemos também acessar os elementos em ordem reversa usando índices negativos.

Neste esquema, o último caracter de uma string está no índice $-1$, o penúltimo no índice $-2$, e assim por diante, como mostrado no exemplo abaixo.

s = "Olá, mundo!"
print(s[-1])
print(s[-2])
print(s[-4])
'!'
'o'
'n'

Podemos ainda acessar fatias ou “slices” de uma string (o mesmo vale para lista em Python). Uma fatia de uma string nada mais é do que uma substring. Assim, a notação de slices nos fornece uma ferramenta para acessar substrings em Python. Esta notação é muito concisa e poderosa, então iremos com calma, mostrando muitos exemplos.

Uma fatia de uma string pode ser acessada se fornecermos os índices do começo e do final da fatia que desejamos analisar, como ilustrado abaixo.

s[1:3]
'lá'

Perceba que, como mencionamos anteriormente, os índices de uma string começam do 0 e não do 1.

Além disso, note que o índice do final da fatia não é incluído nela. No exemplo acima, a slice [1:3] nos retornou dois caracteres e não três: obtivemos o caracter no índice $1$ e o caracter no índice $2$, mas não o caracter no índice $3$.

Se omitirmos o índice de ínicio da fatia ou o de final, o ínicio e o final da string serão considerados, respectivamente. Veja os exemplos:

s = "Olá, mundo!"

# Omitir o início significa começar no índice zero
print(s[:3])

# Omitir o final significa ir até o fim da string
print(s[5:])

# Omitir o início e o final nos retorna toda a string
print(s[:])
Olá
mundo!
Olá, mundo!

É possível ainda especificar um parâmetro que indica quantos caracteres devem ser processados de cada vez. Por exemplo, se quisermos imprimir somente os caracteres nos índices pares ou ímpares de uma string, podemos fazer assim:

s = "Olá, mundo!"
print(s[::2]) # Imprime os caracteres nos índices pares
print(s[1::2]) # Imprime os caracteres nos índices ímpares
Oá ud!
l,mno

Um outro exemplo útil do uso da técnica de slicing para manipulação de strings é inverter uma palavra ou frase:

frase = "Mundo mundo vasto mundo"
print(frase[::-1])
odnum otsav odnum odnuM

No exemplo acima, usamos um terceiro parâmetro do recurso de slicing para indicar que retornamos toda a frase (os ::). Logo em seguida dizemos que faremos isso de trás para frente (por meio do $-1$ no final).

Especificamente, o $-1$ indica que estamos saltando um caracter de cada vez, começando de trás para frente (o que é feito por meio do sinal de menos).

Então, para resumir, a sintaxe de slicing de strings é a seguinte [início:fim:salto], onde:

  • início é o primeiro índice a ser considerado. O primeiro caracter da string é usado caso este valor seja omitido.
  • fim - 1 é o último índice a ser considerado. O último caracter da string é usado caso este valor seja omitido.
  • salto indica quantos caracteres devem ser saltados em cada etapa (o valor $1$ é usado por padrão). O sinal de menos deve ser usado para percorrer a string em ordem reversa.

Formatação de strings em Python

Python possui vários recursos para formatação de strings. Existem dois formatos dominantes hoje em dia: a formatação simples com o comando print, e as chamadas f-strings. Nesta seção cobriremos esses dois recursos para formatação de strings.

Quando falamos sobre formatação de strings, estamos na verdade falando sobre um tema mais abrangente chamado interpolação de strings. Na prática, quando imprimimos uma string, algumas partes da string são desconhecidas. Frequentemente imprimimos o valor de alguma variável juntamente com uma explicação. Por exemplo, se estivermos validando um campo de um formulário que recebe a idade de uma pessoa e o usuário fornecer um valor negativo, podemos imprimir a mensagem: “Idade inválida: somente valores positivos são aceitos. Valor fornecido: VALOR”. No lugar do termo VALOR, precisamos substituir o valor que o usuário forneceu. O processo de substituir valores dentro de strings pré-determinadas é chamado de interpolação.

Para interpolações básicas como a mencionada acima, podemos usar a função print do Python. Mas para casos mais complexos, f-strings tornam o processo mais simples e claro, como veremos a seguir.

Formatação básica de strings com print

Os exemplos abaixo mostram como fazer formatação (ou interpolação) básica de strings usando a função print.

# A função print imprime o valor da variável depois da string
ano = 1822
print("A Independência do Brasil ocorreu em: ", ano)

# A função print concatena strings com um espaço entre elas.
print("Admirável", "Mundo", "Novo")

# A função print converte números para strings.
print(1984, "George Orwell")

# As strings somadas com + são concatenadas sem espaços entre elas.
print("#" + "Programando" + "Em" + "Python")
A Independência do Brasil ocorreu em: 1822
Admirável Mundo Novo
1984 George Orwell
#ProgramandoEmPython

Perceba que nos exemplos acima estamos simplesmente substituindo o valor de uma variável ou concatenando strings ao imprimi-las. Para casos assim, a função print funciona bem. Para casos mais complexos, precisamos de recursos mais versáteis como as f-strings.

Formatação de strings com f-strings

As versões mais novas do Python introduziram um recurso chamado f-strings, que melhoram ainda mais a formatação de strings em casos complexos. Vejamos um exemplo:

# Formatação de strings com f-strings
linguagem = "Python"
f"Programando em {linguagem}"
print(frase)

# Exemplo mais complexo
base = 3
altura = 4
msg = f"Um triângulo de base igual a {base} e altura igual a {altura} possui área igual a {(base * altura) / 2}"
print(msg)
Programando em Python
Um triângulo de base igual a 3 e altura igual a 4 possui área igual a 6.0

Perceba que no primeiro caso poderíamos ter usado a função print, mas no segundo caso seria bem inconveniente usar essa função. Já com f-strings o resultado é bastante legível. Além disso, note que f-strings são um recurso poderoso: podemos até mesmo interpolar o valor de expressões complexas em strings!

Embora Python possua outros recursos para formatação de strings, na prática as duas opções descritas aqui são as mais aconselhadas. Sugiro que você se familiarize com elas, pois elas serão muito úteis ao lidar com strings em seus programas.

Resumo de Operações em Strings

A tabela abaixo mostra um resumo dos principais operadores para manipulação de strings em Python.

Operações em strings

Operador Descrição Exemplo
+ concatena (soma) duas strings ’abra’ + ‘cadabra’ retorna ’abracadabra'
* repete (replica) uma string múltiplas vezes ’ha’ * 3 retorna ’hahaha'
[i] retorna o i-ésimo caractere da string ’Brasil’[0] retorna ’B'
[i:j] retorna a substring que vai dos índices i até j - 1 ’Brasil’[0:3] retorna ’Bra'

Nas próximas seções continuaremos a ver outros tipos de dados compostos em Python.

Exercícios

  1. Escreva uma função que recebe duas strings a e b como entrada e retorna True se a e b são anagramas uma da outra. Duas strings são anagramas se elas contêm os mesmos caracteres e na mesma quantidade, ou seja, é possível re-escrever uma das strings simplesmente reorganizando as letras da outra. Por exemplo, “Orlando” e “Ronaldo” são anagramas, pois possuem os mesmos caracteres na mesma quantidade.
Clique para ver a solução

A chave para resolver este exercício é criar uma “assinatura” para cada uma das strings e comparar as assinaturas.

def anagrama(a, b):
    return sorted(a) == sorted(b)

anagrama("Orlando", "Ronaldo")
True
  1. Escreva uma função que recebe duas strings s e retorna True se s for um palindromo.
Clique para ver a solução
def palindromo(s):
    return False

palindromo("aba")
True