Módulo 14 - Datas e expressões regulares
Padrões básicos de regex
12 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Usar re.search para achar a primeira ocorrência e re.findall para todas.
- Aplicar as classes \d, \w e \s em padrões reais.
- Combinar com os quantificadores mais e asterisco.
- Usar colchetes para conjuntos e as âncoras de início e fim.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Padrões básicos de regex.
Os objetivos desta aula. Usar re.search para achar a primeira ocorrência e re.findall para todas. Aplicar as classes \d, \w e \s em padrões reais. Combinar com os quantificadores mais e asterisco. Usar colchetes para conjuntos e as âncoras de início e fim.
Veja o essencial, parte por parte.
search acha um, findall acha todos. re.search(padrao, texto) acha a primeira ocorrência e devolve um Match (ou None).
Classes e quantificadores. O coração das regex são as classes de caractere, que representam grupos.
Conjuntos com colchetes e âncoras. re.search(r"\d+", "abc123") casa, porque acha os dígitos no meio.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
search acha um, findall acha todos
As duas funções que você mais vai usar são re.search e re.findall. A search percorre o texto e para na primeira parte que casa com o padrão, devolvendo um objeto Match; se nada casar, devolve None, que é falso em uma condição. Do Match você lê o trecho encontrado com .group(). Já a findall não para no primeiro: ela devolve uma lista com todos os trechos que casam, do começo ao fim. Use search quando quer saber se existe ou pegar o primeiro; use findall quando quer coletar tudo.
import re
texto = "Notas: 8, 10 e 7 no bimestre"
# search: primeira ocorrencia, como objeto Match
m = re.search(r"\d+", texto)
print(m.group()) # 8
# findall: todas as ocorrencias, como lista
print(re.findall(r"\d+", texto)) # ['8', '10', '7']
# search sem casar devolve None:
print(re.search(r"\d+", "sem numeros aqui")) # Nonesearch devolve o primeiro Match (ou None); findall devolve a lista de todos os trechos.
Classes e quantificadores
O coração das regex são as classes de caractere, que representam grupos. A classe \d casa com um dígito de 0 a 9. A classe \w casa com um caractere de palavra: letra, dígito ou sublinhado. A classe \s casa com um espaço em branco, o que inclui a tabulação e a quebra de linha. Cada uma dessas casa com apenas um caractere. Para casar com vários, você combina com um quantificador: o sinal de mais (+) exige uma ou mais repetições, e o asterisco (*) aceita zero ou mais. Assim, \d+ casa com um número inteiro inteiro, com quantos dígitos tiver.
| Símbolo | Casa com | Exemplo de padrão |
|---|---|---|
| \d | Um dígito (0 a 9) | \d+ acha 4521 |
| \w | Letra, dígito ou sublinhado | \w+ acha uma palavra |
| \s | Um espaço em branco | \s+ acha o espaço entre palavras |
| + | Uma ou mais vezes o anterior | \d+ casa 1 ou 100 |
| * | Zero ou mais vezes o anterior | -*\d casa 5 ou -5 |
| {n} | Exatamente n vezes | \d{4} casa 2026 |
As classes e os quantificadores mais usados. Combine-os para descrever formatos.
import re
# \d+ pega numeros inteiros de qualquer tamanho
print(re.findall(r"\d+", "ano 2026, mes 7, dia 2"))
# ['2026', '7', '2']
# \w+ pega palavras (letras, digitos, sublinhado)
print(re.findall(r"\w+", "user_1 fez login"))
# ['user_1', 'fez', 'login']
# \d{4} exige exatamente 4 digitos (ex.: um ano)
print(re.findall(r"\d{4}", "de 2026 a 2027, codigo 12"))
# ['2026', '2027'] (o 12 tem so 2 digitos, nao casa)Combinar classe e quantificador descreve formatos: números, palavras, anos de quatro dígitos.
Conjuntos com colchetes e âncoras
Quando as classes prontas não bastam, você monta seu próprio conjunto com colchetes. O padrão [aeiou] casa com uma vogal; [0-9] casa com um dígito, igual a \d; e [a-z] casa com uma letra minúscula. Dentro dos colchetes, o hífen indica um intervalo. As âncoras completam o quadro: o acento circunflexo (^) marca o começo do texto e o cifrão ($) marca o fim. Elas não casam com um caractere; casam com uma posição. Com ^ e $ você exige que o padrão descreva o texto inteiro, não só um pedaço no meio.
import re
# Conjunto: um caractere que seja vogal
print(re.findall(r"[aeiou]", "Python")) # ['o']
# Intervalo dentro do conjunto: uma letra minuscula
print(re.findall(r"[a-z]+", "Ola Mundo 123")) # ['la', 'undo']
# Ancoras: o texto INTEIRO e formado por digitos?
print(bool(re.search(r"^\d+$", "12345"))) # True
print(bool(re.search(r"^\d+$", "123a5"))) # False (tem letra)
print(bool(re.search(r"^\d+$", "12 45"))) # False (tem espaco)Colchetes montam conjuntos; ^ e $ prendem o padrão ao início e ao fim do texto.
Junte as peças e você já descreve formatos úteis. Um e-mail bem simples, por exemplo, é uma sequência de caracteres de palavra, um arroba, mais caracteres, um ponto e o final: \w+@\w+\.\w+. Repare no \. com barra invertida: como o ponto sozinho é um símbolo especial de regex (casa com qualquer caractere), você escapa com barra para dizer que quer um ponto literal. Esse padrão não valida todos os e-mails do mundo, mas mostra como classes, o arroba literal e o ponto escapado se combinam para reconhecer uma forma real.
import re
# E-mail simples: palavra, arroba, palavra, ponto, palavra
padrao = r"\w+@\w+\.\w+"
texto = "Contatos: ana@exemplo.com e joao@teste.org"
print(re.findall(padrao, texto))
# ['ana@exemplo.com', 'joao@teste.org']
# O ponto precisa de barra (\.) para ser um ponto literal,
# senao ele casaria com QUALQUER caractere.Um padrão de e-mail simples reúne classes, o arroba literal e o ponto escapado com \.
Teste rápido
Qual padrão confere se um texto é formado apenas por dígitos, do começo ao fim?
Perguntas frequentes
- Qual a diferença prática entre re.search e re.findall?
- re.search para na primeira ocorrência e devolve um objeto Match (ou None se nada casar), do qual você lê o trecho com .group(). re.findall percorre tudo e devolve uma lista com todos os trechos que casam. Use search para o primeiro; findall para coletar todos.
- Qual a diferença entre + e * nos padrões?
- O + exige uma ou mais repetições do item anterior, então \d+ precisa de pelo menos um dígito. O * aceita zero ou mais, então \d* casa até com texto vazio. Na dúvida entre os dois, o + costuma ser o que você quer, porque exige que algo apareça.
- Por que o ponto precisa de barra invertida, como em \.?
- Porque, sozinho, o ponto é um símbolo especial de regex que casa com qualquer caractere. Ao escrever \., com a barra, você diz que quer um ponto literal, o caractere ponto de verdade. Escapar com barra vale para outros símbolos especiais, como + e *.
- O que \d{4} significa?
- Significa exatamente quatro dígitos seguidos. As chaves {n} são um quantificador de contagem exata, então \d{4} casa com 2026, mas não com 12 (que tem dois) nem com 12345 sozinho. Você também pode dar um intervalo, como \d{2,4} para dois a quatro dígitos.
- Para que servem as âncoras ^ e $?
- Elas marcam posições, não caracteres: ^ é o começo do texto e $ é o fim. Ao envolver um padrão com ^ e $, você exige que o texto inteiro se encaixe, e não só um pedaço no meio. É essencial para validar formatos, como conferir se algo é só dígitos.
- Esse padrão de e-mail valida qualquer endereço?
- Não. O padrão \w+@\w+\.\w+ é uma versão didática e simples, que reconhece a forma básica nome@dominio.extensao. E-mails reais têm regras bem mais complexas. Para o curso ele ilustra bem como combinar classes e símbolos; em produção, use validações mais completas.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.