Fundamentos de Strings
O tipo de dado mais comum com que você vai trabalhar não são números — é texto. Nomes de usuário, emails, artigos, dados JSON, HTML... todas strings. Esta lição cobre sistematicamente as operações de string do Python.
1. Três Tipos de Aspas
Python permite três formas de definir strings:
# Aspas simples
s1 = 'Hello'
# Aspas duplas
s2 = "Hello"
# Aspas triplas (strings multilinha)
s3 = """Esta é a primeira linha
Esta é a segunda linha
Esta é a terceira linha"""
Aspas simples e duplas são equivalentes — escolha uma e mantenha consistência:
# Estas duas são equivalentes
name = 'João Silva'
name = "João Silva"
Mas se sua string contiver aspas, você precisará misturar:
# String tem aspas simples, envolva com aspas duplas
text = "It's a beautiful day"
print(text) # It's a beautiful day
# String tem aspas duplas, envolva com aspas simples
text = 'He said: "Hello!"'
print(text) # He said: "Hello!"
# Ou use um caractere de escape (não recomendado, prejudica legibilidade)
text = 'It\'s a beautiful day'
Aspas Triplas: Ótimas para Texto Multilinha
Aspas triplas (""" ou ''') preservam quebras de linha e formatação:
# Texto multilinha com aspas triplas
message = """Prezado Cliente,
Obrigado por escolher nosso serviço. Seu pedido foi confirmado.
Previsão de entrega: 3 dias úteis.
Se tiver alguma dúvida, entre em contato com o suporte.
Tenha um ótimo dia!"""
print(message)
Saída:
Prezado Cliente,
Obrigado por escolher nosso serviço. Seu pedido foi confirmado.
Previsão de entrega: 3 dias úteis.
Se tiver alguma dúvida, entre em contato com o suporte.
Tenha um ótimo dia!
Aspas triplas são comumente usadas para: texto longo, strings de documentação e descrições de funções.
2. Caracteres de Escape
Alguns caracteres não podem ser escritos diretamente em uma string (como quebras de linha, tabulações ou as próprias aspas). Use caracteres de escape — uma barra invertida \ seguida de um caractere.
| Escape | Significado |
|---|---|
\n |
Nova linha |
\t |
Tabulação |
\\ |
Própria barra invertida |
\' |
Aspa simples |
\" |
Aspa dupla |
print("Primeira linha\nSegunda linha") # \n nova linha
print("Nome:\tJoão Silva\tIdade:\t25") # \t alinhamento com tab
print("C:\\Usuários\\João\\Desktop") # \\ exibe barra invertida
print("Ele disse: \"Olá!\"") # \" aspa dupla
Saída:
Primeira linha
Segunda linha
Nome: João Silva Idade: 25
C:\Usuários\João\Desktop
Ele disse: "Olá!"
Exemplo: Formatando uma Tabela com Caracteres de Escape (Dificuldade ⭐)
# Use \t para alinhar uma tabela
print("Item\tPreço\tQtd\tTotal")
print("------------------------")
print("Maçã\t5.0\t3\t15.0")
print("Banana\t3.5\t5\t17.5")
print("Leite\t12.0\t2\t24.0")
Saída:
Item Preço Qtd Total
------------------------
Maçã 5.0 3 15.0
Banana 3.5 5 17.5
Leite 12.0 2 24.0
\t é útil para alinhar texto, mas se os comprimentos do conteúdo variarem, o alinhamento pode não ser perfeito. Para produção, use formatação com f-string ({valor:10} para ocupar 10 caracteres de largura).
3. Strings Brutas (Raw Strings)
Se você já escreveu caminhos de arquivo no Windows, já experimentou essa dor:
# Ops! \n é interpretado como nova linha
path = "C:\Users\new_folder\documents"
print(path)
# Saída: C:\Users
# ew_folder\documents
Solução: prefixe a string com r, informando ao Python "não processe caracteres de escape, exiba como está":
# ✅ String bruta — prefixo r
path = r"C:\Users\new_folder\documents"
print(path)
# Saída: C:\Users\new_folder\documents
Em uma string bruta, cada caractere é ele mesmo — \n não significa mais nova linha, \t não significa mais tabulação.
# Padrões regex (usaremos isso depois)
pattern = r"\d{3}-\d{8}" # Corresponder números de telefone: 010-12345678
# Caminhos de arquivo
log_path = r"D:\logs\app\2026\06\error.log"
print(f"Caminho do log: {log_path}")
r"abc\" dará erro. Por quê? Mesmo que \" não seja tratado como escape, o analisador vê a barra invertida como escapando a aspa de fechamento, causando uma string não terminada.
4. Indexação de Strings
Uma string é uma sequência de caracteres, cada um com uma posição (índice). Os índices do Python começam em 0:
text = "Python"
# Índice: 0→P 1→y 2→t 3→h 4→o 5→n
print(text[0]) # P
print(text[1]) # y
print(text[5]) # n
Python também suporta indexação negativa, contando da direita para a esquerda. -1 é o último caractere:
text = "Python"
print(text[-1]) # n (último)
print(text[-2]) # o (penúltimo)
print(text[-3]) # h
print(text[-6]) # P (primeiro)
Diagrama de Índices
Positivo: 0 1 2 3 4 5
┌────┬────┬────┬────┬────┬────┐
│ P │ y │ t │ h │ o │ n │
└────┴────┴────┴────┴────┴────┘
Negativo: -6 -5 -4 -3 -2 -1
Exemplo: Extrair Informação de um Número de Identidade (Dificuldade ⭐)
# Extrai informações básicas de um número de identidade
id_number = "110101199001011234"
# Primeiros 6 dígitos: código da região
address_code = id_number[:6] # Abordaremos fatiamento a seguir
print(f"Código da região: {address_code}")
# Dígitos 7-14: data de nascimento
birth = id_number[6:14]
year = birth[:4]
month = birth[4:6]
day = birth[6:8]
print(f"Data de nascimento: {year}-{month}-{day}")
# Último dígito (-1): dígito verificador
last_digit = id_number[-1]
print(f"Dígito verificador: {last_digit}")
Saída:
Código da região: 110101
Data de nascimento: 1990-01-01
Dígito verificador: 4
string[6:14] é chamado de fatiamento — abordaremos a seguir.
5. Fatiamento de Strings (Slicing)
Fatiamento extrai uma substring de uma string. Sintaxe: string[início:fim:passo]
text = "Hello, Python!"
# Fatiamento básico: início:fim (fim é exclusivo)
print(text[0:5]) # Hello (caracteres 0 a 4)
print(text[7:13]) # Python
Atalhos
text = "Hello, Python!"
print(text[:5]) # Hello — omita início, do começo até o índice 5
print(text[7:]) # Python! — omita fim, do índice 7 até o fim
print(text[:]) # Hello, Python! — tudo
Passo
text = "Hello, Python!"
print(text[::2]) # Hlo yhn! — a cada 2 caracteres
print(text[1::2]) # el,Pto — começa em 1, a cada 2
Passo Negativo (Inversão)
text = "Hello, Python!"
print(text[::-1]) # !nohtyP ,olleH — inverte a string inteira!
print(text[5:0:-1]) # ,olle — do índice 5 ao 0, direção reversa
Exemplos de Fatiamento
# Truques práticos de fatiamento
url = "https://www.example.com"
# Remove prefixo do protocolo
without_https = url[8:] # www.example.com
print(without_https)
# Obtém domínio
domain = url[8:-4] # www.example
print(domain)
# Inverte uma string
name = "racecar"
reversed_name = name[::-1] # racecar (palíndromo)
print(name == reversed_name) # True — é um palíndromo!
# Caracteres alternados
code = "H1e2l3l4o5"
clean = code[::2] # Hello
print(clean)
Saída:
www.example.com
www.example
True
Hello
[::-1] é a forma clássica do Python para inverter uma string — simples e elegante. Observe que o fatiamento nunca levanta IndexError — mesmo se o início ou fim exceder o comprimento da string, Python retorna com segurança o que pode.
6. Métodos Comuns de String
Strings têm muitos métodos embutidos. Vamos cobrir os mais comuns aqui. Não precisa memorizar tudo — saber o que está disponível é suficiente; você memorizará com a prática.
Conversão de Maiúsculas/Minúsculas
text = "Hello, Python!"
print(text.upper()) # HELLO, PYTHON!
print(text.lower()) # hello, python!
print(text.title()) # Hello, Python!
print(text.capitalize()) # Hello, python!
Remoção de Espaços
text = " Hello, World! "
print(f"|{text}|") # | Hello, World! |
print(f"|{text.strip()}|") # |Hello, World!| — ambos os lados
print(f"|{text.lstrip()}|") # |Hello, World! | — apenas esquerda
print(f"|{text.rstrip()}|") # | Hello, World!| — apenas direita
Busca e Substituição
text = "Hello, Python! Python is fun!"
print(text.find("Python")) # 7 — posição da primeira ocorrência
print(text.find("Java")) # -1 — não encontrado, retorna -1
print(text.count("Python")) # 2 — número de ocorrências
new_text = text.replace("Python", "Java")
print(new_text) # Hello, Java! Java is fun!
# replace pode especificar máximo de substituições
partial = text.replace("Python", "Java", 1)
print(partial) # Hello, Java! Python is fun!
Métodos de Verificação
print("hello".isalpha()) # True — todas letras
print("hello123".isalpha()) # False — tem dígitos
print("12345".isdigit()) # True — todos dígitos
print("hello123".isalnum()) # True — letras e dígitos
print("hello!".isalnum()) # False — tem ponto de exclamação
print(" ".isspace()) # True — todos espaços
if user_input.isdigit(): garante que a conversão int() não falhará.
Divisão e Junção
# split(): string → lista
sentence = "I love Python"
words = sentence.split()
print(words) # ['I', 'love', 'Python']
# Especifique o delimitador
csv_line = "João Silva,25,São Paulo"
fields = csv_line.split(",")
print(fields) # ['João Silva', '25', 'São Paulo']
# join(): lista → string
parts = ["2026", "06", "23"]
date = "-".join(parts)
print(date) # 2026-06-23
Exemplo: Limpeza de Dados (Dificuldade ⭐⭐)
# Simula entrada de usuário suja
raw_data = " João Silva , 25 , São Paulo \n"
# Processo de limpeza
# 1. strip() remove espaços no início/fim
cleaned = raw_data.strip()
print(f"Passo 1: |{cleaned}|")
# 2. split() por vírgula
fields = cleaned.split(",")
print(f"Passo 2: {fields}")
# 3. Remove espaços extras de cada campo
name = fields[0].strip()
age = fields[1].strip()
city = fields[2].strip()
print(f"Nome: {name}")
print(f"Idade: {age}")
print(f"Cidade: {city}")
Saída:
Passo 1: |João Silva , 25 , São Paulo|
Passo 2: ['João Silva ', ' 25 ', ' São Paulo']
Nome: João Silva
Idade: 25
Cidade: São Paulo
7. len(): Obtendo Comprimento de String
len() é uma função embutida do Python que retorna o comprimento de uma string (ou outras sequências):
text = "Hello, Python!"
print(len(text)) # 15
# Caracteres chineses contam como 1 cada
chinese = "你好世界"
print(len(chinese)) # 4
# String vazia tem comprimento 0
print(len("")) # 0
# Uso comum: limitar comprimento de entrada
username = "João Silva"
if len(username) < 2:
print("Nome de usuário muito curto")
elif len(username) > 10:
print("Nome de usuário muito longo")
else:
print(f"Nome de usuário '{username}' é válido")
len("ç") retorna 1, não 2. Isso torna as operações de string mais intuitivas.
Casos de Uso Comuns
- Limpeza de entrada: Use
strip()para remover espaços no início/fim,lower()para normalizar endereços de email. - Manipulação de caminhos de arquivo: Use
split()para extrair nomes de arquivo,replace()para converter separadores de caminho. - Análise de logs: Use
find()para localizar palavras-chave, fatiamento para extrair seções específicas de log. - Formatação de dados: Use
split()para analisar linhas CSV,join()para remontar saída. - Validação de senha: Use
isalnum(),isdigit(),isalpha()para verificar tipos de caracteres de senha. - Inversão de texto:
[::-1]para inversão rápida de string, útil para verificação de palíndromos ou codificação simples.
❓ Perguntas Frequentes
P: Aspas simples vs aspas duplas — qual devo usar? Por que Python permite ambas? R: Historicamente, os designers do Python acreditavam em dar escolha ao programador. Programadores C/Java tendem a usar aspas duplas; programadores JavaScript usam ambas. É recomendado usar aspas duplas consistentemente, porque o inglês frequentemente tem apóstrofos (it's, don't, can't), então aspas duplas evitam escape. Mais importante, mantenha consistência dentro de um projeto — não as misture. ⚠️ P: Por que o índice final é excluído? Como em
text[0:5]não inclui o índice 5? R: Esta é a filosofia de design do Python — intervalos semi-abertos[início, fim). Dois benefícios: 1)text[:5]é fácil de lembrar (primeiros 5 caracteres); 2)text[0:5]etext[5:10]se conectam perfeitamente sem sobreposição ou lacunas. Você apreciará este design depois de se acostumar. P: Qual a diferença entrefind()eindex()? R: Eles fazem a mesma coisa — encontrar posição de substring. Diferença:find()retorna-1quando não encontrado;index()levanta um erro (ValueError). Usefind()por segurança no trabalho diário. Useindex()quando tiver certeza de que a substring existe (ex.: extraindo de dados com formato fixo). P: Por que os métodos de string não modificam a string original? (ex.:text.upper()não alteratext) R: Porque strings em Python são imutáveis. Uma vez criadas, não podem ser modificadas.text.upper()na verdade retorna uma nova string; otextoriginal permanece o mesmo. Isso garante segurança dos dados — quando você passa uma string para uma função, pode ter certeza de que ela não será modificada secretamente. Para "modificar" uma string, crie uma nova através de fatiamento e concatenação.
📖 Resumo
- Strings têm três formas de aspas: simples, dupla, tripla; aspas duplas são recomendadas
- Caracteres de escape
\n,\t,\\, etc., representam caracteres especiais - Strings brutas
r"..."previnem escape de barra invertida, ótimas para caminhos e regex - Indexação começa em 0, suporta indexação negativa (
-1é o último caractere) - Fatiamento
[início:fim:passo]extrai substrings; fim é exclusivo; passo negativo inverte - Métodos comuns:
strip(),split(),join(),find(),replace() - Métodos de verificação:
isdigit(),isalpha(),isalnum(), etc., para validação de entrada - Strings são imutáveis — todas as "modificações" criam novas strings
📝 Atividades
-
Básico (Dificuldade ⭐): Dado
s = "Python programming is fun!", faça o seguinte:- Extraia os primeiros 6 caracteres
- Extraia os últimos 4 caracteres
- Inverta a string inteira
- Converta todas as letras para maiúsculas
-
Intermediário (Dificuldade ⭐⭐): Escreva um validador de email. Dado
email = "user@example.com", verifique se:- Contém
@ - Há conteúdo em ambos os lados de
@(nenhum lado vazio) - Termina com
.com,.cnou.org - Exiba cada resultado de verificação (True/False) Dica: Use
find()para localizar@, fatiamento para verificar ambos os lados.
- Contém
-
Desafio (Dificuldade ⭐⭐⭐): Escreva um limpador de dados. Dado:
TEXTdata = " João Silva, 25 , São Paulo ; Maria Souza , 30, Rio de Janeiro ; Pedro Santos , 22, Belo Horizonte "Divida por
;para obter os dados de cada pessoa, depois divida por,para obter cada campo. Usestrip()para limpar cada campo, depois exiba uma tabela alinhada:TEXTNome Idade Cidade ────────────────────────── João Silva 25 São Paulo Maria Souza 30 Rio de Janeiro Pedro Santos 22 Belo Horizonte



