Regex Python: Tudo Sobre Expressões Regulares

Publicado em: 05/01/2026
Tempo de leitura: 12 minutos
Ilustração minimalista do logotipo da linguagem de programação Python ao lado do texto REGEX em fundo neutro

Se você já tentou encontrar padrões específicos em textos, validar formatos de email ou extrair informações de documentos, provavelmente já sentiu a necessidade de uma ferramenta poderosa para isso. As expressões regulares, também conhecidas como regex, são exatamente essa solução.

Neste guia completo, você vai aprender tudo sobre como usar regex no Python de forma prática e acessível. Mesmo que você nunca tenha trabalhado com strings em Python de forma avançada, este artigo vai te mostrar o caminho.

O Que São Expressões Regulares

Expressões regulares são sequências de caracteres que formam um padrão de busca. Pense nelas como uma linguagem especial que permite descrever o que você está procurando em um texto.

Por exemplo, imagine que você precisa encontrar todos os números de telefone em um documento com milhares de páginas. Fazer isso manualmente seria impossível. Com regex, você cria um padrão que representa “qualquer número de telefone” e o Python faz a busca automaticamente.

A biblioteca padrão do Python para trabalhar com regex é a re. Ela vem instalada por padrão, então você não precisa baixar nada extra. Basta importá-la no seu código e começar a usar.

Por Que Usar Regex no Python

As expressões regulares resolvem problemas que seriam extremamente complicados usando métodos tradicionais de manipulação de strings. Veja algumas situações práticas:

  • Validação de dados: Verificar se um email, CPF ou telefone está no formato correto
  • Extração de informações: Pegar datas, valores monetários ou códigos em meio a textos longos
  • Substituição inteligente: Trocar padrões específicos por outros valores
  • Web scraping: Encontrar dados específicos em páginas HTML
  • Limpeza de dados: Remover caracteres indesejados ou formatar textos

Quem trabalha com web scraping ou análise de dados com Pandas usa regex diariamente. É uma habilidade essencial para qualquer desenvolvedor Python.

Importando a Biblioteca re

Antes de começar a usar expressões regulares, você precisa importar o módulo re. É super simples:

Python
import re

Pronto! Agora você tem acesso a todas as funções necessárias para trabalhar com regex. As principais funções que você vai usar são:

  • re.search() para encontrar a primeira ocorrência
  • re.findall() para encontrar todas as ocorrências
  • re.match() para verificar se o início da string corresponde ao padrão
  • re.sub() para substituir padrões encontrados
  • re.split() para dividir strings usando um padrão

Metacaracteres Básicos em Regex

Os metacaracteres são símbolos especiais que têm significados únicos nas expressões regulares. Vamos conhecer os mais importantes:

MetacaractereSignificadoExemplo
.Qualquer caractere (exceto quebra de linha)a.b encontra “acb”, “a5b”
^Início da string^Python encontra “Python” no início
$Fim da stringfim$ encontra “fim” no final
*Zero ou mais repetiçõesab* encontra “a”, “ab”, “abb”
+Uma ou mais repetiçõesab+ encontra “ab”, “abb”
?Zero ou uma ocorrênciaab? encontra “a” ou “ab”
[]Conjunto de caracteres[abc] encontra “a”, “b” ou “c”
|OU lógicoa|b encontra “a” ou “b”

Esses metacaracteres permitem criar padrões flexíveis e poderosos. Com o tempo e prática, você vai combinar vários deles para resolver problemas complexos.

Classes de Caracteres Especiais

Além dos metacaracteres básicos, o regex oferece classes especiais que representam grupos comuns de caracteres:

  • \d representa qualquer dígito (0-9)
  • \D representa qualquer caractere que não seja dígito
  • \w representa caracteres alfanuméricos (letras, números e underscore)
  • \W representa caracteres especiais (tudo que não é alfanumérico)
  • \s representa espaços em branco (espaço, tab, quebra de linha)
  • \S representa qualquer coisa que não seja espaço em branco

Essas classes economizam muito tempo. Em vez de escrever [0-9], você pode simplesmente usar \d. Funciona exatamente igual, mas é muito mais rápido de digitar.

Função search() do Python

A função re.search() procura a primeira ocorrência de um padrão em uma string. Ela retorna um objeto Match se encontrar, ou None se não encontrar nada.

Python
import re

texto = "Meu email é contato@exemplo.com"
resultado = re.search(r'\w+@\w+\.\w+', texto)

if resultado:
    print("Email encontrado:", resultado.group())
else:
    print("Email não encontrado")

Neste exemplo, o padrão \w+@\w+\.\w+ busca qualquer sequência de caracteres alfanuméricos, seguida de @, mais caracteres, um ponto e mais caracteres. É um padrão simples para encontrar emails.

O r antes da string do padrão indica uma “raw string”. Isso evita problemas com barras invertidas, que são comuns em regex. Sempre use r'' nos seus padrões.

Função findall() para Múltiplas Ocorrências

Diferente do search(), a função re.findall() retorna todas as ocorrências do padrão em uma lista. É extremamente útil quando você precisa extrair vários elementos de um texto.

Python
import re

texto = "Os telefones são (11) 98765-4321 e (21) 91234-5678"
telefones = re.findall(r'\(\d{2}\) \d{5}-\d{4}', texto)

print(telefones)
# Saída: ['(11) 98765-4321', '(21) 91234-5678']

O padrão \(\d{2}\) \d{5}-\d{4} procura por números de telefone brasileiros no formato (XX) XXXXX-XXXX. O {2} e {5} indicam exatamente quantos dígitos queremos.

Essa técnica é muito usada em projetos de automação com Python, onde você precisa processar grandes volumes de texto.

Substituindo Texto com sub()

A função re.sub() permite substituir todas as ocorrências de um padrão por outro texto. É como o “localizar e substituir” de editores de texto, mas muito mais poderoso.

Python
import re

texto = "Meu CPF é 123.456.789-00"
texto_limpo = re.sub(r'[.-]', '', texto)

print(texto_limpo)
# Saída: Meu CPF é 12345678900

Aqui, o padrão [.-] encontra pontos ou hífens, e o segundo argumento '' (string vazia) os remove. Você pode usar isso para limpar dados antes de processar ou salvar em dicionários ou bancos de dados.

Quantificadores em Expressões Regulares

Os quantificadores controlam quantas vezes um elemento do padrão deve aparecer. Já vimos alguns como *, + e ?, mas existem outros:

  • {n} exatamente n repetições
  • {n,} no mínimo n repetições
  • {n,m} entre n e m repetições

Exemplos práticos:

Python
import re

# CEP brasileiro (5 dígitos, hífen, 3 dígitos)
cep = re.search(r'\d{5}-\d{3}', '01234-567')

# Senha com 8 a 20 caracteres alfanuméricos
senha = re.search(r'\w{8,20}', 'minhaSenha123')

print("CEP válido:", cep.group() if cep else "Inválido")
print("Senha válida:", senha.group() if senha else "Inválida")

Grupos de Captura

Os grupos de captura permitem extrair partes específicas de um padrão. Você cria grupos usando parênteses ().

Python
import re

texto = "Data: 05/01/2026"
resultado = re.search(r'(\d{2})/(\d{2})/(\d{4})', texto)

if resultado:
    dia = resultado.group(1)
    mes = resultado.group(2)
    ano = resultado.group(3)
    
    print(f"Dia: {dia}, Mês: {mes}, Ano: {ano}")
    # Saída: Dia: 05, Mês: 01, Ano: 2026

Cada par de parênteses cria um grupo numerado. O group(1) retorna o primeiro grupo, group(2) o segundo, e assim por diante. O group(0) ou apenas group() retorna o padrão completo.

Isso é muito útil quando você trabalha com leitura de arquivos de texto que têm formatos estruturados.

Validação de Email com Regex

Um dos usos mais comuns de regex é validar emails. Embora uma validação 100% perfeita seja complexa, podemos criar um padrão que funcione para a maioria dos casos:

Python
import re

def validar_email(email):
    padrao = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    return re.match(padrao, email) is not None

# Testes
print(validar_email("usuario@exemplo.com"))      # True
print(validar_email("invalido@.com"))            # False
print(validar_email("sem-arroba.com"))           # False

Este padrão verifica se o email tem caracteres válidos antes do @, um domínio válido após o @, e uma extensão com pelo menos 2 caracteres (.com, .br, .info, etc).

Para projetos profissionais que envolvem automação de emails, essa validação evita erros e garante que você está trabalhando com endereços corretos.

Muita gente confunde re.match() com re.search(). A diferença é importante:

  • match() verifica apenas o início da string
  • search() procura em qualquer parte da string
Python
import re

texto = "Olá, meu Python é incrível!"

# match() não encontra porque "Python" não está no início
resultado_match = re.match(r'Python', texto)
print("Match encontrou:", resultado_match)  # None

# search() encontra porque procura em toda a string
resultado_search = re.search(r'Python', texto)
print("Search encontrou:", resultado_search.group())  # Python

Use match() quando precisar verificar se a string inteira segue um formato (como validar CPF). Use search() quando quiser encontrar um padrão em qualquer posição do texto.

Exemplos Práticos de Regex

Vamos ver alguns padrões úteis para o dia a dia:

Python
import re

# Validar CPF (formato XXX.XXX.XXX-XX)
cpf = r'\d{3}\.\d{3}\.\d{3}-\d{2}'

# Encontrar URLs
url = r'https?://[^\s]+'

# Extrair valores monetários (R$ 123,45)
dinheiro = r'R\$\s?\d{1,3}(?:\.\d{3})*,\d{2}'

# Encontrar hashtags
hashtag = r'#\w+'

# Validar placa de carro brasileiro (ABC-1234 ou ABC1D23)
placa = r'[A-Z]{3}-?\d[A-Z\d]\d{2}'

# Teste com valor monetário
texto = "O produto custa R$ 1.299,99"
valor = re.search(dinheiro, texto)
print("Valor encontrado:", valor.group() if valor else "Não encontrado")

Você pode adaptar esses padrões para suas necessidades. A documentação oficial do Python oferece mais detalhes sobre a biblioteca re.

Flags em Expressões Regulares

As flags modificam o comportamento das expressões regulares. As mais comuns são:

  • re.IGNORECASE ou re.I ignora maiúsculas e minúsculas
  • re.MULTILINE ou re.M faz ^ e $ funcionarem com cada linha
  • re.DOTALL ou re.S faz o ponto (.) incluir quebras de linha
Python
import re

texto = "Python é INCRÍVEL"

# Sem flag, não encontra por causa do I maiúsculo
resultado1 = re.search(r'incrível', texto)
print("Sem flag:", resultado1)  # None

# Com flag IGNORECASE, encontra
resultado2 = re.search(r'incrível', texto, re.IGNORECASE)
print("Com flag:", resultado2.group())  # INCRÍVEL

As flags são passadas como terceiro argumento nas funções de regex. Você pode combinar várias usando o operador |, como re.I | re.M.

Perguntas Frequentes (FAQ)

1. O que significa regex?

Regex é a abreviação de “Regular Expression” (Expressão Regular). São padrões usados para buscar, validar e manipular textos de forma eficiente.

2. Preciso instalar algo para usar regex no Python?

Não. O módulo re já vem instalado com o Python. Basta importar com import re.

3. Qual a diferença entre \d e [0-9]?

Nenhuma! Ambos representam dígitos de 0 a 9. O \d é apenas uma forma mais curta e conveniente de escrever.

4. Como faço para encontrar todas as ocorrências de um padrão?

Use a função re.findall(). Ela retorna uma lista com todas as ocorrências encontradas no texto.

5. Por que devo usar r antes da string do padrão?

O r cria uma “raw string” que trata barras invertidas literalmente. Isso evita conflitos, já que regex usa muitas barras invertidas.

6. Posso usar regex para substituir texto?

Sim! Use a função re.sub(padrao, substituicao, texto) para substituir todas as ocorrências do padrão.

7. Como valido um CPF com regex?

Use o padrão \d{3}\.\d{3}\.\d{3}-\d{2} para validar o formato XXX.XXX.XXX-XX. Mas lembre-se que isso só valida o formato, não se o CPF existe.

8. O que são grupos de captura?

São partes do padrão delimitadas por parênteses (). Eles permitem extrair pedaços específicos do texto encontrado.

9. Regex funciona em outros idiomas além de português?

Sim! Regex funciona com qualquer texto, independente do idioma. Os padrões são universais.

10. Qual a diferença entre * e +?

O asterisco (*) aceita zero ou mais repetições, enquanto o mais (+) exige pelo menos uma ocorrência.

11. Como ignoro maiúsculas e minúsculas em uma busca?

Use a flag re.IGNORECASE ou re.I como terceiro argumento da função, por exemplo: re.search(padrao, texto, re.I).

12. Regex é rápido para processar grandes volumes de texto?

Sim! Regex é muito otimizado. Porém, padrões muito complexos podem ficar lentos. Teste sempre com dados reais se trabalhar com grandes volumes.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Fundamentos
    Foto do Leandro Hirt

    Como resolver erros de codificação UTF‑8 no Python

    Resolver erros de codificação UTF-8 no Python pode parecer um desafio intimidador para quem está começando, mas é um dos

    Ler mais

    Tempo de leitura: 11 minutos
    21/02/2026
    Fundamentos
    Foto do Leandro Hirt

    FileNotFoundError – Resolva esse erro de caminhos no Python

    Você acabou de escrever um script incrível, configurou toda a lógica de programação e, na hora de executar, o terminal

    Ler mais

    Tempo de leitura: 10 minutos
    20/02/2026
    Fundamentos
    Foto do Leandro Hirt

    Como criar e usar dataclasses em Python facilmente

    No vasto ecossistema da programação, gerenciar dados em classes pode, muitas vezes, parecer uma tarefa repetitiva e cansativa. Se você

    Ler mais

    Tempo de leitura: 9 minutos
    18/02/2026
    Fundamentos
    Foto do Leandro Hirt

    Entendendo o operador walrus (:=) no Python

    O ecossistema do Python é conhecido por sua simplicidade e legibilidade, mas isso não significa que a linguagem pare de

    Ler mais

    Tempo de leitura: 9 minutos
    18/02/2026
    Fundamentos
    Foto do Leandro Hirt

    Entendendo o módulo collections em Python

    O módulo collections é uma das ferramentas mais poderosas e subutilizadas da biblioteca padrão do Python. Embora os tipos de

    Ler mais

    Tempo de leitura: 10 minutos
    17/02/2026
    Fundamentos
    Foto do Leandro Hirt

    Hash de senhas em Python: Crie hashes seguros em minutos

    Garantir a segurança dos dados dos usuários é uma das responsabilidades mais críticas de qualquer desenvolvedor de software. Quando falamos

    Ler mais

    Tempo de leitura: 10 minutos
    16/02/2026