⬅ Voltar ao Dashboard Capítulo 7 — Strings

💬 Strings: Introdução e Pesquisa

Seção 7.0–7.3 — Imutabilidade, verificação, contagem e pesquisa

🔒 7.0 Strings são Imutáveis

Diferentemente das listas, as strings em Python são imutáveis: não é possível alterar um caractere individual de uma string diretamente. Qualquer tentativa de atribuir um valor a um índice gera um erro do tipo TypeError:

Listagem 7.1 — Alteração de uma string>>> s = "Alô Mundo" >>> s[0] = "a" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment

Para modificar caracteres individuais, uma estratégia é converter a string em uma lista usando list(), fazer as alterações e depois converter de volta com "".join():

Listagem 7.2 — Conversão de string para lista e de volta>>> s = "Alô Mundo" >>> L = list(s) >>> L ['A', 'l', 'ô', ' ', 'M', 'u', 'n', 'd', 'o'] >>> L[0] = "a" >>> s = "".join(L) >>> s 'alô Mundo'

O método join() concatena todos os elementos de uma lista usando a string à esquerda como separador. Com "" (string vazia), os caracteres são simplesmente reunidos sem nenhum separador.

🔍 7.1 Verificação Parcial de Strings

Python oferece métodos práticos para verificar se uma string começa ou termina com determinado texto, sem precisar acessar cada caractere manualmente.

startswith e endswith

Os métodos startswith() e endswith() retornam True ou False e são sensíveis a maiúsculas e minúsculas:

Listagem 7.3 — startswith e endswith>>> nome = "João da Silva" >>> nome.startswith("João") True >>> nome.startswith("joão") False >>> nome.endswith("Silva") True

Para fazer verificações sem distinguir maiúsculas de minúsculas, use lower() ou upper() primeiro. Esses métodos retornam uma nova string convertida, sem alterar a original:

Listagem 7.4 — lower, upper e startswith>>> s = "O Rato roeu a roupa do Rei de Roma" >>> s.lower() 'o rato roeu a roupa do rei de roma' >>> s.upper() 'O RATO ROEU A ROUPA DO REI DE ROMA' >>> s.lower().startswith("o rato") True >>> s.upper().startswith("O RATO") True

Operador in e not in

O operador in verifica se uma substring está contida dentro de outra string. Também é sensível a maiúsculas e minúsculas:

Listagem 7.5 — Operador in com strings>>> s = "Maria Amélia Souza" >>> "Amélia" in s True >>> "Maria" in s True >>> "Souza" in s True >>> "a A" in s True >>> "amélia" in s False
Listagem 7.6 — Operador not in>>> s = "Todos os caminhos levam a Roma" >>> "levam" not in s False >>> "Caminhos" not in s True >>> "AS" not in s True

Para ignorar maiúsculas ao usar in, aplique lower() ou upper() antes da verificação:

Listagem 7.7 — Verificação sem distinção de maiúsculas>>> s = "João comprou um carro" >>> "joão" in s.lower() True >>> "CARRO" in s.upper() True >>> "comprou" not in s.lower() False >>> "barco" not in s.lower() True

🔢 7.2 Contagem

O método count() conta quantas vezes uma substring aparece dentro de uma string. A busca é sensível a maiúsculas e não conta sobreposições:

Listagem 7.8 — Contagem com count>>> t = "um tigre, dois tigres, três tigres" >>> t.count("tigre") 3 >>> t.count("tigres") 2 >>> t.count("t") 4 >>> t.count("z") 0

Note que count("tigre") retorna 3 porque "tigres" contém "tigre". Já count("tigres") retorna 2, pois conta somente as ocorrências exatas de "tigres".

🔎 7.3 Pesquisa de Strings

Para localizar a posição de uma substring dentro de uma string, usamos o método find(). Ele retorna o índice da primeira ocorrência ou -1 se não encontrar:

Listagem 7.9 — Método find>>> s = "Alô mundo" >>> s.find("mun") 4 >>> s.find("ok") -1

O método rfind() funciona como find(), mas busca a partir do final da string (retornando a última ocorrência):

Listagem 7.10 — find e rfind comparados>>> s = "Um dia de sol" >>> s.find("d") 3 >>> s.rfind("d") 7

Ambos aceitam parâmetros opcionais de início e fim para limitar o intervalo de busca:

Listagem 7.11 — find com parâmetros de intervalo>>> s = "um tigre, dois tigres, três tigres" >>> s.find("tigres") 15 >>> s.rfind("tigres") 28 >>> s.find("tigres", 7) 15 >>> s.find("tigres", 30) -1 >>> s.find("tigres", 0, 10) -1

Pesquisa de Todas as Ocorrências

Para encontrar todas as ocorrências de uma substring, podemos usar um laço while que chama find() repetidamente, avançando a partir da última posição encontrada:

Listagem 7.12 — Pesquisa de todas as ocorrênciass = "um tigre, dois tigres, três tigres" p = 0 while p > -1: p = s.find("tigre", p) if p >= 0: print("Posição: %d" % p) p += 1
Listagem 7.13 — Resultado da pesquisaPosição: 3 Posição: 15 Posição: 28

A variável p serve como marcador: começa em 0 e a cada iteração avança um passo além da última ocorrência encontrada (p += 1). Quando find() retorna -1, a condição while p > -1 termina o laço.

Exercício 7.1

Leia duas strings. Verifique se a segunda ocorre dentro da primeira e imprima a posição de início.

Exemplo: 1ª string: AABBEFAATT, 2ª string: BE

Saída: BE encontrado na posição 3 de AABBEFAATT

Exercício 7.2

Leia duas strings e gere uma terceira com os caracteres comuns às duas strings lidas (cada caractere comum aparece uma vez no resultado).

Exemplo: 1ª: AAACTBF, 2ª: CBT → Resultado: CBT

Exercício 7.3

Leia duas strings e gere uma terceira apenas com os caracteres que aparecem em somente uma delas (diferença simétrica).

Exemplo: 1ª: CTA, 2ª: ABC → 3ª: BT

Exercício 7.4

Leia uma string e imprima quantas vezes cada caractere aparece.

Exemplo: String: TTAACT: 2x, A: 2x, C: 1x

Exercício 7.5

Leia duas strings e gere uma terceira na qual os caracteres da segunda foram retirados da primeira.

Exemplo: 1ª: AATTGGAA, 2ª: TG → 3ª: AAAA

Exercício 7.6

Leia três strings. Imprima o resultado da substituição, na primeira, dos caracteres da segunda pelos da terceira (substituição caractere a caractere).

Exemplo: 1ª: AATTCGAA, 2ª: TG, 3ª: AC → Resultado: AAAACCAA