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:

PYTHON
# 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:

PYTHON
# Estas duas são equivalentes
name = 'João Silva'
name = "João Silva"

Mas se sua string contiver aspas, você precisará misturar:

PYTHON
# 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'
💡 Dica: É recomendado usar aspas duplas consistentemente. Texto em inglês frequentemente contém apóstrofos (don't, it's) — com aspas simples você precisaria escapá-los. Aspas duplas evitam esse problema.

Aspas Triplas: Ótimas para Texto Multilinha

Aspas triplas (""" ou ''') preservam quebras de linha e formatação:

PYTHON
# 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:

TEXT
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
PYTHON
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:

TEXT
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 ⭐)

PYTHON
# 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")
▶ Experimente

Saída:

TEXT
Item	Preço	Qtd	Total
------------------------
Maçã	5.0	3	15.0
Banana	3.5	5	17.5
Leite	12.0	2	24.0
💡 Dica: \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:

PYTHON
# 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á":

PYTHON
# ✅ 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.

PYTHON
# 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}")
⚠️ Observação: O último caractere de uma string bruta não pode ser uma barra invertida — 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:

PYTHON
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:

PYTHON
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

TEXT
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 ⭐)

PYTHON
# 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}")
▶ Experimente

Saída:

TEXT
Código da região: 110101
Data de nascimento: 1990-01-01
Dígito verificador: 4
💡 Dica: 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]

PYTHON
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

PYTHON
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

PYTHON
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)

PYTHON
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

PYTHON
# 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)
▶ Experimente

Saída:

TEXT
www.example.com
www.example
True
Hello
💡 Dica: [::-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

PYTHON
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

PYTHON
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

PYTHON
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

PYTHON
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
💡 Dica: Estes métodos de verificação são muito úteis para validação de entrada. Por exemplo, verificar se a entrada do usuário são todos dígitos: if user_input.isdigit(): garante que a conversão int() não falhará.

Divisão e Junção

PYTHON
# 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 ⭐⭐)

PYTHON
# 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}")
▶ Experimente

Saída:

TEXT
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):

PYTHON
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")
💡 Dica: Em Python 3, o comprimento da string conta caracteres, não bytes. len("ç") retorna 1, não 2. Isso torna as operações de string mais intuitivas.


Casos de Uso Comuns


❓ 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] e text[5:10] se conectam perfeitamente sem sobreposição ou lacunas. Você apreciará este design depois de se acostumar. P: Qual a diferença entre find() e index()? R: Eles fazem a mesma coisa — encontrar posição de substring. Diferença: find() retorna -1 quando não encontrado; index() levanta um erro (ValueError). Use find() por segurança no trabalho diário. Use index() 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 altera text) 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; o text original 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


📝 Atividades

  1. 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
  2. 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, .cn ou .org
    • Exiba cada resultado de verificação (True/False) Dica: Use find() para localizar @, fatiamento para verificar ambos os lados.
  3. Desafio (Dificuldade ⭐⭐⭐): Escreva um limpador de dados. Dado:

    TEXT
    data = "   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. Use strip() para limpar cada campo, depois exiba uma tabela alinhada:

    TEXT
    Nome          Idade Cidade
    ──────────────────────────
    João Silva    25    São Paulo
    Maria Souza   30    Rio de Janeiro
    Pedro Santos  22    Belo Horizonte
    
100%