Regex Python: Tudo Sobre Expressões Regulares

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 é [email protected]"
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("[email protected]"))      # True
print(validar_email("[email protected]"))            # 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

    Logo do Python, texto TXT e ícone de bloco de notas representando arquivos de texto
    Fundamentos
    Foto do Leandro Hirt

    Como Ler Arquivos TXT no Python

    Trabalhar com arquivos de texto é uma das tarefas mais comuns na programação. Aprender como ler arquivo TXT no Python

    Ler mais

    Tempo de leitura: 14 minutos
    24/12/2025
    Comparação visual entre Python 2 e Python 3 com ícones minimalistas
    Fundamentos
    Foto do Leandro Hirt

    Python 2 vs Python 3: Principais Diferenças

    Se você está começando a estudar Python ou já trabalha com a linguagem, provavelmente já se deparou com uma dúvida

    Ler mais

    Tempo de leitura: 20 minutos
    22/12/2025
    Pessoa pensando com um monitor desfocado ao fundo
    Fundamentos
    Foto do Leandro Hirt

    Tipos de Dados em Python: int, float, str, list e dict

    Aprenda tudo sobre os principais tipos de dados em Python: int, float, str, list e dict. Guia completo com exemplos

    Ler mais

    Tempo de leitura: 14 minutos
    21/12/2025
    Pessoa usando tablet com caneta digital para planejar tarefas em checklist, representando organização, planejamento e produtividade digital.
    Fundamentos
    Foto do Leandro Hirt

    Como Ordenar Listas no Python (Sort vs Sorted)

    Você já ficou confuso sobre quando usar sort() ou sorted() para organizar suas listas em Python? Não está sozinho. Esses

    Ler mais

    Tempo de leitura: 12 minutos
    20/12/2025
    Logo do Python com uma faca, simbolizando fatiamento
    Fundamentos
    Foto do Leandro Hirt

    Fatiamento em Python: Tudo Sobre Slicing

    O fatiamento (ou slicing) é uma técnica fundamental em Python que permite extrair partes específicas de sequências como listas, strings

    Ler mais

    Tempo de leitura: 11 minutos
    13/12/2025
    Logo CSV e logo do Python com um símbolo de '+'
    Fundamentos
    Foto do Leandro Hirt

    Como trabalhar com arquivos CSV no Python

    Aprenda a ler, escrever e manipular arquivos CSV usando Python. Guia completo com exemplos práticos da biblioteca csv padrão e

    Ler mais

    Tempo de leitura: 12 minutos
    10/12/2025