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.
- 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 comreplace(). - A quebrar um texto em pedaços com
split(). - A procurar com
find(),index(),startswith(),endswith()ecount(), e a testar comisdigit()eisalpha(). - Por que
nome.upper()sozinho não mudanome, 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étodo | O que faz | Exemplo → 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
cidadedo 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
nome.upper()na linha 2 fabricou"ANA"… e ninguém guardou. O Python jogou fora.- Por isso, o primeiro
printmostrouana, ainda em minúsculas. nome = nome.upper()fabrica"ANA"e guarda na variávelnome. Agora sim.
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ções | Qual usar |
|---|---|---|
| saber se o texto tem um pedaço | "@" in email · email.find("@") != -1 · email.count("@") > 0 | O 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 com | arquivo.startswith("foto") · arquivo[:4] == "foto" | startswith(): não precisa contar letras |
| comparar sem ligar para maiúsculas | a.lower() == b.lower() · a.upper() == b.upper() | Tanto faz; o costume é lower() |
| apagar um pedaço | replace(" e leite", "") · fatias | replace(), se você sabe o que apagar; fatias, se sabe onde |
Quando dá errado
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.
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
strnão tem o atributouper": 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.
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.
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").
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étodo | O que devolve | Exemplo → 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:
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/capitalizemudam maiúsculas, com acentos e cedilha funcionando;striplimpa as pontas;replacetroca;splitquebra numa lista.finddiz onde (ou-1);indextambém, mas dáValueErrorse não achar;startswith,endswithecountrespondem "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.