Python Métodos de Texto

Um texto no Python vem com uma caixa de ferramentas: deixar tudo em maiúsculas, tirar os espaços que o usuário digitou sem querer, trocar uma palavra por outra, quebrar uma frase em palavras, procurar onde está o @ de um email. Essas ferramentas se chamam métodos, e você as usa com um ponto depois do texto: nome.upper(). Esta aula apresenta os mais usados, um de cada vez, com acentos e cedilha (que funcionam muito bem), e o erro que todo mundo comete: achar que o método muda o texto.

Você vai aprender
  • O que é um método e como se escreve: texto.metodo().
  • A mudar maiúsculas e minúsculas: upper(), lower(), title(), capitalize().
  • A limpar espaços das pontas com strip(), e a trocar pedaços com replace().
  • A quebrar um texto em pedaços com split().
  • A procurar com find(), index(), startswith(), endswith() e count(), e a testar com isdigit() e isalpha().
  • Por que nome.upper() sozinho não muda nome, e os erros reais: AttributeError, ValueError, TypeError.

A ideia: o canivete do texto

Pense num canivete suíço: um objeto só, com várias ferramentas dobradas dentro (a faca, a tesoura, o abridor). Você não precisa ir buscar a tesoura em outro lugar; ela já vem com o canivete. Um texto do Python é assim: cada texto já traz as suas ferramentas, e você as "abre" com um ponto.

nome
O texto (ou a variável que guarda o texto) em que a ferramenta vai trabalhar.
.
O ponto quer dizer "a ferramenta deste texto…".
upper
O nome do método (em inglês, "de cima": as letras maiúsculas, que nas gráficas antigas ficavam na caixa de cima).
( )
Os parênteses usam a ferramenta, como numa função. Alguns métodos pedem informações dentro deles, como replace("pão", "bolo").

Um método é uma função que pertence a um tipo de valor. len(nome) é uma função comum, que serve para muitos tipos; nome.upper() é um método, que só os textos têm.


1. Maiúsculas e minúsculas

cidade = "São Luís do Maranhão"

print(cidade.upper())
print(cidade.lower())
print("joão da silva".title())
print("bom dia, ana".capitalize())
print("AÇÃO".lower())
print(cidade)
$ python3 maiusculas2.py
SÃO LUÍS DO MARANHÃO
são luís do maranhão
João Da Silva
Bom dia, ana
ação
São Luís do Maranhão
MétodoO que fazExemplo → resultado
upper()Tudo em MAIÚSCULAS"São Luís".upper() → 'SÃO LUÍS'
lower()Tudo em minúsculas"AÇÃO".lower() → 'ação'
title()A Primeira Letra De Cada Palavra"joão da silva".title() → 'João Da Silva'
capitalize()Só a primeira letra do texto todo"bom dia, ana".capitalize() → 'Bom dia, ana'

Repare em três coisas:

  • Acentos e cedilha funcionam: ã vira Ã, í vira Í, Ç vira ç. Os textos do Python são Unicode, o padrão que tem as letras de todas as línguas.
  • O title() não conhece o português: ele escreveu "Da" com maiúscula, e num nome brasileiro o costume é "João da Silva". Para nomes, use com cuidado.
  • A última linha mostra cidade do jeito que era. Nenhum método mudou o texto. É o assunto da próxima seção.

2. O método não muda o texto: ele devolve um novo

Você aprendeu em Strings que textos são imutáveis. Então o upper() não tem como mudar o texto: ele fabrica um texto novo, em maiúsculas, e o devolve. Se você não guardar esse texto novo, ele se perde:

nome = "ana"
nome.upper()
print(nome)

nome = nome.upper()
print(nome)
$ python3 metodo-novo.py
ana
ANA
  1. nome.upper() na linha 2 fabricou "ANA"… e ninguém guardou. O Python jogou fora.
  2. Por isso, o primeiro print mostrou ana, ainda em minúsculas.
  3. nome = nome.upper() fabrica "ANA" e guarda na variável nome. Agora sim.
Guarde o resultado

Todo método de texto que "muda" alguma coisa (upper, lower, strip, replace…) devolve um texto novo. Ou você guarda (nome = nome.upper()), ou usa na hora (print(nome.upper())). Escrever só nome.upper() numa linha sozinha não faz nada.


3. strip(): limpando as pontas

Quando alguém digita o nome num formulário, é comum sobrar espaço no começo ou no fim. O strip() (em inglês, "descascar") tira os espaços das pontas. Os colchetes no exemplo estão ali só para você ver onde o texto começa e termina:

digitado = "   Ana Souza   "

print("[" + digitado + "]")
print("[" + digitado.strip() + "]")
print("[" + digitado.lstrip() + "]")
print("[" + digitado.rstrip() + "]")
print("...ola!!!".strip(".!"))
$ python3 strip.py
[   Ana Souza   ]
[Ana Souza]
[Ana Souza   ]
[   Ana Souza]
ola
  • strip() tirou os espaços dos dois lados, mas não o espaço do meio, entre "Ana" e "Souza".
  • lstrip() tira só da esquerda (left); rstrip(), só da direita (right).
  • Com um texto dentro dos parênteses, ele tira esses caracteres das pontas, em vez de espaços: strip(".!") tirou os pontos e as exclamações.

O strip() também tira das pontas as quebras de linha e as tabulações (os \n e \t da aula Caracteres de Escape). Por isso ele é tão usado com o que vem do teclado e de arquivos.


4. Encadeando métodos

Como cada método devolve um texto, você pode chamar outro método logo em seguida, no resultado: é o encadeamento. O jeito clássico de conferir uma resposta digitada, sem ligar para espaços nem maiúsculas:

resposta = "  SIM  "

limpa = resposta.strip()
limpa = limpa.lower()
print(limpa)

print(resposta.strip().lower())
print(resposta.strip().lower() == "sim")
$ python3 encadear.py
sim
sim
True

resposta.strip().lower() se lê da esquerda para a direita: primeiro o strip() devolve "SIM"; depois o lower() trabalha nesse texto novo e devolve "sim". As duas formas (passo a passo, ou encadeada) dão o mesmo resultado.

Missão: a Ana digitou " Sim ", com espaços e S maiúsculo, e o programa respondeu False. Faça a comparação dar True, limpando a resposta com strip() e lower() antes de comparar.

resposta = "  Sim "
print(resposta == "sim")
resposta = "  Sim "
print(resposta.strip().lower() == "sim")

5. replace(): trocando pedaços

O replace() (em inglês, "substituir") troca um pedaço do texto por outro. Ele pede dois textos: o que procurar e o que pôr no lugar.

recado = "Comprar pão, pão doce e leite"

print(recado.replace("pão", "bolo"))
print(recado.replace("pão", "bolo", 1))
print(recado.replace(" e leite", ""))
print("86 99999-0000".replace(" ", "").replace("-", ""))
print(recado.replace("queijo", "requeijão"))
$ python3 replace.py
Comprar bolo, bolo doce e leite
Comprar bolo, pão doce e leite
Comprar pão, pão doce
86999990000
Comprar pão, pão doce e leite
replace("pão", "bolo")
Troca todos os "pão" por "bolo". Eram dois.
replace("pão", "bolo", 1)
O terceiro valor, opcional, limita quantas trocas fazer: só a primeira.
replace(" e leite", "")
Trocar por um texto vazio é o jeito de apagar um pedaço.
.replace(" ", "").replace("-", "")
Encadeado: apaga os espaços, depois os traços. Sobram só os algarismos do telefone.
replace("queijo", …)
Se o pedaço não existe, nada é trocado, e não dá erro: volta o texto igual.

Missão: a placa da padaria saiu sem acento: fuba. Corrija o texto com replace(), trocando "fuba" por "fubá", sem mexer na primeira linha.

placa = "Bolo de fuba: R$ 25"
print(placa)
placa = "Bolo de fuba: R$ 25"
print(placa.replace("fuba", "fubá"))

6. split(): quebrando em pedaços

O split() (em inglês, "dividir") faz o contrário do join() da aula Juntar e Repetir Textos: ele quebra o texto onde encontra um separador e devolve uma lista com os pedaços (as listas têm aula própria: Listas).

compras = "pão, leite, café"
print(compras.split(", "))

frase = "a Ana foi à feira"
print(frase.split())

data = "18/10/2026"
dia, mes, ano = data.split("/")
print(dia, mes, ano)
print(len(frase.split()))
$ python3 split.py
['pão', 'leite', 'café']
['a', 'Ana', 'foi', 'à', 'feira']
18 10 2026
5
  • split(", ") quebrou onde havia vírgula e espaço. O separador some do resultado.
  • split() sem nada nos parênteses quebra nos espaços (quantos houver): é o jeito de separar as palavras de uma frase.
  • dia, mes, ano = data.split("/") guarda cada pedaço numa variável, de uma vez (a Atribuição Múltipla).
  • len(frase.split()) conta as palavras da frase: 5.

7. Procurando: find(), index(), startswith(), endswith(), count()

O in da aula is e in responde "tem ou não tem?". Estes métodos respondem mais: onde está, se está no começo ou no fim, e quantas vezes aparece.

find() e index(): em que posição?

email = "ana.souza@email.com"

print(email.find("@"))
print(email.find("souza"))
print(email.find("gmail"))
print(email.index("@"))
print(email[:email.find("@")])
$ python3 find.py
9
4
-1
9
ana.souza
  • find("@") devolve o índice onde o pedaço começa: o @ está na posição 9 (contando do zero, como em Índices e Fatias).
  • find("souza") dá 4: a palavra começa no índice 4.
  • Quando não acha, o find() devolve -1.
  • index() faz a mesma busca, mas, quando não acha, dá erro (você vai ver em Quando dá errado).
  • Junto com uma fatia, o find() recorta: email[:9] é tudo antes do @, o nome do usuário.

startswith() e endswith(): começa com? termina com?

arquivo = "foto-praia.jpg"

print(arquivo.startswith("foto"))
print(arquivo.endswith(".jpg"))
print(arquivo.endswith(".png"))
print(arquivo.endswith((".jpg", ".png")))
print("Foto".startswith("foto"))
$ python3 comeca.py
True
True
False
True
False

startswith é "começa com" (starts with), e endswith, "termina com" (ends with). São ótimos para conferir a extensão de um arquivo. Com vários textos entre parênteses duplos, endswith((".jpg", ".png")) pergunta "termina com algum destes?" (os parênteses de dentro formam uma tupla). E, como sempre, maiúsculas contam: "Foto" não começa com "foto".

count(): quantas vezes?

frase = "O rato roeu a roupa do rei de Roma"

print(frase.count("r"))
print(frase.count("R"))
print(frase.lower().count("r"))
print(frase.count("ro"))
print("banana".count("ana"))
$ python3 count.py
4
1
5
2
1

São 4 erres minúsculos e 1 maiúsculo (o de Roma); com tudo em minúsculas, 5. O count("ro") achou "roeu" e "roupa" (o "Ro" de Roma tem maiúscula). E a última linha tem uma pegadinha: "banana" tem "ana" duas vezes, sobrepostas (banana e banana), mas o count() só conta pedaços que não se sobrepõem: depois de achar o primeiro, ele continua a busca depois dele.


8. Perguntas sobre o texto: isdigit() e isalpha()

Os métodos que começam com is ("é…?") respondem True ou False sobre o texto inteiro:

print("2026".isdigit())
print("20,5".isdigit())
print("Ana".isalpha())
print("Ana Maria".isalpha())
print("ção".isalpha())
print("".isdigit())
$ python3 testes.py
True
False
True
False
True
False
  • isdigit(): só tem algarismos? "2026" sim; "20,5" não, por causa da vírgula.
  • isalpha(): só tem letras? "Ana" sim; "Ana Maria" não, por causa do espaço; "ção" sim: letras com acento e cedilha são letras.
  • Texto vazio dá False: não tem algarismo nenhum.

Um uso comum é conferir, antes de converter com int(), se o que foi digitado é mesmo um número. A outra forma de fazer isso, mais completa, é a aula try e except.


Formas diferentes de fazer a mesma coisa

Você quer…OpçõesQual usar
saber se o texto tem um pedaço"@" in email · email.find("@") != -1 · email.count("@") > 0O in: mais curto e claro
saber onde estáfind() · index()find() se "não achar" for normal (dá -1); index() se não achar for um erro
saber se começa comarquivo.startswith("foto") · arquivo[:4] == "foto"startswith(): não precisa contar letras
comparar sem ligar para maiúsculasa.lower() == b.lower() · a.upper() == b.upper()Tanto faz; o costume é lower()
apagar um pedaçoreplace(" e leite", "") · fatiasreplace(), se você sabe o que apagar; fatias, se sabe onde

Quando dá errado

Esqueceu os parênteses
nome = "ana"
print(nome.upper)
$ python3 sem-parenteses.py
<built-in method upper of str object at 0x7fd6517949c0>

Não deu erro, mas também não deu ANA. Sem os parênteses, você não usou a ferramenta: só apontou para ela, e o Python mostrou o que ela é, "método embutido upper de um objeto str, no endereço…". (O número 0x7fd6517949c0 é um endereço na memória e muda a cada vez que você roda; no editor do guia ele sai mais curto, como 0xe54fc0.) Como consertar: nome.upper(), com os parênteses.

Nome do método digitado errado: AttributeError
nome = "ana"
print(nome.uper())
$ python3 nome-errado.py
Traceback (most recent call last):
  File "/home/ana/nome-errado.py", line 2, in <module>
    print(nome.uper())
          ^^^^^^^^^
AttributeError: 'str' object has no attribute 'uper'. Did you mean: 'upper'?
File "/home/ana/nome-errado.py", line 2
O erro está na linha 2.
^^^^^^^^^
Sublinha nome.uper, o pedaço que falhou.
AttributeError:
"Erro de atributo". Atributo é tudo o que vem depois do ponto: métodos e outras informações de um valor.
'str' object has no attribute 'uper'
"Um objeto str não tem o atributo uper": os textos não têm nenhuma ferramenta com esse nome.
Did you mean: 'upper'?
"Você quis dizer upper?" O Python achou o nome parecido e sugeriu.

Como consertar: nome.upper(). A lista completa dos nomes está na Referência de Métodos de String.

Usou o método como se fosse uma função: NameError
print(upper("ana"))
$ python3 lower-variavel.py
Traceback (most recent call last):
  File "/home/ana/lower-variavel.py", line 1, in <module>
    print(upper("ana"))
          ^^^^^
NameError: name 'upper' is not defined. Did you mean: 'super'?

name 'upper' is not defined: não existe uma função solta chamada upper. Ela é um método, e só existe "dentro" dos textos. A dica (super, outra coisa do Python) não ajuda aqui. Como consertar: o texto vem antes do ponto, "ana".upper().

index() não achou: ValueError
email = "ana.souza.email.com"
posicao = email.index("@")
print(posicao)
$ python3 index-erro.py
Traceback (most recent call last):
  File "/home/ana/index-erro.py", line 2, in <module>
    posicao = email.index("@")
ValueError: substring not found

ValueError: substring not found: "erro de valor: o pedaço não foi encontrado". O email foi digitado sem @, e o index(), ao contrário do find(), não devolve -1: ele para o programa. Como consertar: se "não achar" pode acontecer, use find() e confira se deu -1; ou teste antes com "@" in email.

Número no replace(): TypeError
preco = "R$ 10"
print(preco.replace(10, 12))
$ python3 replace-numero.py
Traceback (most recent call last):
  File "/home/ana/replace-numero.py", line 2, in <module>
    print(preco.replace(10, 12))
          ~~~~~~~~~~~~~^^^^^^^^
TypeError: replace() argument 1 must be str, not int

replace() argument 1 must be str, not int: "o argumento 1 do replace() precisa ser str, não int". Dentro de um texto só há texto, então o que se procura e o que se põe no lugar também têm de ser textos. Como consertar: preco.replace("10", "12").

Achou que o método mudava o texto

O erro mais comum desta aula não tem mensagem nenhuma. Você já viu na seção 2: nome.upper() sozinho numa linha não muda nome. Se um texto "não mudou" depois de um strip() ou de um replace(), confira se você guardou o resultado: nome = nome.strip().


Referência rápida

Os métodos desta aula. A lista completa, com todos os métodos de texto, está em Métodos de String.

MétodoO que devolveExemplo → resultado
upper()Texto em maiúsculas"pão".upper() → 'PÃO'
lower()Texto em minúsculas"AÇÃO".lower() → 'ação'
title()Primeira letra de cada palavra maiúscula"joão da silva".title() → 'João Da Silva'
capitalize()Só a primeira letra do texto maiúscula"bom dia".capitalize() → 'Bom dia'
strip()Sem espaços (e quebras de linha) nas pontas" oi ".strip() → 'oi'
lstrip() / rstrip()Só da esquerda / só da direita" oi".lstrip() → 'oi'
replace(velho, novo)Texto com as trocas feitas"banana".replace("a", "o") → 'bonono'
split(sep)Lista de pedaços"a-b-c".split("-") → ['a', 'b', 'c']
find(pedaço)Índice onde começa, ou -1"Teresina".find("e") → 1
index(pedaço)Índice onde começa, ou ValueError"Teresina".index("e") → 1
startswith(pedaço)True se começa com"Teresina".startswith("Tere") → True
endswith(pedaço)True se termina com"foto.jpg".endswith(".jpg") → True
count(pedaço)Quantas vezes aparece (sem sobrepor)"Teresina".count("e") → 2
isdigit()True se só tem algarismos"2026".isdigit() → True
isalpha()True se só tem letras"ção".isalpha() → True

Exercícios

1. Grite!

Complete o método que deixa tudo em maiúsculas:

print("bom dia".())

2. Limpe as pontas

O que print(" oi ".strip() + "!") mostra?

3. Troca de vogal

O que print("banana".replace("a", "o")) mostra?

4. Depois de nome = "ana" e nome.upper(), quanto vale nome?

5. Quanto vale "Teresina".find("z")?

6. O que "pão de queijo".split() devolve?

Missão final: o usuário do email

Missão: do email da Ana, mostre só o nome de usuário (tudo antes do @), em maiúsculas: ANA.SOUZA. Use find() (ou index(), ou split()) para achar o @, e upper().

email = "ana.souza@email.com"
print(email)
email = "ana.souza@email.com"
usuario = email[:email.find("@")]
print(usuario.upper())

Resumo

  • Um método é uma ferramenta do próprio texto, usada com ponto e parênteses: texto.upper().
  • Os métodos não mudam o texto (ele é imutável): devolvem um texto novo. Guarde o resultado: nome = nome.strip().
  • upper/lower/title/capitalize mudam maiúsculas, com acentos e cedilha funcionando; strip limpa as pontas; replace troca; split quebra numa lista.
  • find diz onde (ou -1); index também, mas dá ValueError se não achar; startswith, endswith e count respondem "começa?", "termina?", "quantas vezes?".
  • Métodos se encadeiam: resposta.strip().lower() == "sim".
  • Nome errado dá AttributeError … Did you mean: 'upper'?; sem parênteses, aparece <built-in method …> em vez do resultado.