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.

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"))  # None

search 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ímboloCasa comExemplo de padrão
\dUm dígito (0 a 9)\d+ acha 4521
\wLetra, dígito ou sublinhado\w+ acha uma palavra
\sUm 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.