Programador Leigo
Python 11 min leitura 15 MAR 2026

Expressões Regulares em Python: guia prático com exemplos

Domine regex em Python com o módulo re. Busque, valide e extraia padrões de texto como um profissional.


O que são expressões regulares?

Expressões regulares (regex) são padrões para buscar, validar e manipular texto. Quer encontrar todos os emails em um texto? Validar um CPF? Extrair números de uma string? Regex resolve.

import re

texto = "Meu email e contato@email.com e o backup e backup@gmail.com"
emails = re.findall(r"[\w.+-]+@[\w-]+\.[\w.]+", texto)
print(emails)  # ['contato@email.com', 'backup@gmail.com']

O módulo re

Python tem o módulo re na biblioteca padrão:

import re

# Buscar primeira ocorrencia
resultado = re.search(r"Python", "Eu amo Python!")
print(resultado.group())  # Python

# Buscar todas as ocorrencias
todos = re.findall(r"\d+", "Tenho 3 gatos e 2 cachorros")
print(todos)  # ['3', '2']

# Substituir
novo = re.sub(r"\d+", "X", "Tenho 3 gatos e 2 cachorros")
print(novo)  # Tenho X gatos e X cachorros

Caracteres especiais

Padrão Significado Exemplo
. Qualquer caractere c.sa casa com "casa", "cosa"
\d Dígito (0-9) \d\d casa com "42"
\D Não-dígito \D+ casa com "abc"
\w Letra, dígito ou _ \w+ casa com "nome_1"
\W Não-alfanumérico \W casa com "@", " "
\s Espaço em branco \s+ casa com " "
\S Não-espaço \S+ casa com "texto"

Quantificadores

Padrão Significado
* Zero ou mais
+ Um ou mais
? Zero ou um (opcional)
{3} Exatamente 3
{2,5} De 2 a 5
{3,} 3 ou mais
import re

# Telefone com DDD opcional
padrao = r"\(?\d{2}\)?\s?\d{4,5}-?\d{4}"

textos = [
    "(11) 99999-1234",
    "11 98765-4321",
    "1188887777",
]

for t in textos:
    match = re.search(padrao, t)
    if match:
        print(f"Encontrado: {match.group()}")

Âncoras

Padrão Significado
^ Início da string
$ Final da string
\b Limite de palavra
import re

# Comeca com "Python"
print(re.search(r"^Python", "Python e legal"))   # match
print(re.search(r"^Python", "Eu amo Python"))     # None

# Termina com numero
print(re.search(r"\d+$", "versao 3"))    # match
print(re.search(r"\d+$", "3 versoes"))   # None

# Palavra exata
print(re.findall(r"\bfor\b", "for i in format"))  # ['for']

Grupos de captura

Parênteses () criam grupos que você pode extrair:

import re

texto = "Nome: Maria, Idade: 28"
match = re.search(r"Nome: (\w+), Idade: (\d+)", texto)

if match:
    print(match.group(0))   # Nome: Maria, Idade: 28 (tudo)
    print(match.group(1))   # Maria
    print(match.group(2))   # 28

Grupos nomeados

import re

texto = "2026-03-15"
match = re.search(r"(?P<ano>\d{4})-(?P<mes>\d{2})-(?P<dia>\d{2})", texto)

if match:
    print(match.group("ano"))   # 2026
    print(match.group("mes"))   # 03
    print(match.group("dia"))   # 15

Classes de caracteres

import re

# Vogais
vogais = re.findall(r"[aeiou]", "Python")
print(vogais)  # ['o']

# Nao-vogais
consoantes = re.findall(r"[^aeiou]", "Python")
print(consoantes)  # ['P', 'y', 't', 'h', 'n']

# Range
letras = re.findall(r"[a-zA-Z]+", "abc 123 def")
print(letras)  # ['abc', 'def']

Funções principais do módulo re

re.search — primeira ocorrência

import re

match = re.search(r"\d+", "abc 42 def 99")
print(match.group())  # 42

re.findall — todas as ocorrências

import re

numeros = re.findall(r"\d+", "abc 42 def 99")
print(numeros)  # ['42', '99']

re.sub — substituir

import re

# Limpar espacos extras
limpo = re.sub(r"\s+", " ", "texto   com    espacos")
print(limpo)  # texto com espacos

# Censurar palavras
censurado = re.sub(r"bobo|chato", "***", "voce e bobo e chato")
print(censurado)  # voce e *** e ***

re.split — dividir

import re

partes = re.split(r"[,;\s]+", "um, dois; tres  quatro")
print(partes)  # ['um', 'dois', 'tres', 'quatro']

re.compile — padrão reutilizável

import re

padrao_email = re.compile(r"[\w.+-]+@[\w-]+\.[\w.]+")

texto1 = "Contato: ana@email.com"
texto2 = "Suporte: ajuda@empresa.com.br"

print(padrao_email.findall(texto1))  # ['ana@email.com']
print(padrao_email.findall(texto2))  # ['ajuda@empresa.com.br']

Exemplos práticos

Validar email

import re

def email_valido(email):
    padrao = r"^[\w.+-]+@[\w-]+\.[\w.]+$"
    return bool(re.match(padrao, email))

print(email_valido("user@email.com"))      # True
print(email_valido("invalido@"))           # False
print(email_valido("user@site.com.br"))    # True

Validar CPF (formato)

import re

def cpf_formato_valido(cpf):
    return bool(re.match(r"^\d{3}\.\d{3}\.\d{3}-\d{2}$", cpf))

print(cpf_formato_valido("123.456.789-00"))  # True
print(cpf_formato_valido("12345678900"))     # False

Extrair URLs de um texto

import re

texto = """
Acesse https://python.org ou http://flask.pocoo.org
e tambem visite https://docs.python.org/3/
"""

urls = re.findall(r"https?://[\w./-]+", texto)
for url in urls:
    print(url)

Limpar HTML

import re

html = "<p>Texto com <b>negrito</b> e <i>italico</i></p>"
limpo = re.sub(r"<[^>]+>", "", html)
print(limpo)  # Texto com negrito e italico

Flags úteis

import re

# Ignorar maiusculas/minusculas
re.findall(r"python", "Python PYTHON python", re.IGNORECASE)
# ['Python', 'PYTHON', 'python']

# Multiline: ^ e $ funcionam por linha
texto = "linha 1\nlinha 2\nlinha 3"
re.findall(r"^linha \d", texto, re.MULTILINE)
# ['linha 1', 'linha 2', 'linha 3']

# Verbose: regex comentado
padrao = re.compile(r"""
    ^                   # inicio
    [\w.+-]+            # nome do usuario
    @                   # arroba
    [\w-]+              # dominio
    \.[\w.]+            # extensao
    $                   # fim
""", re.VERBOSE)

Resumo

Função Para que serve
re.search() Primeira ocorrência
re.findall() Todas as ocorrências
re.sub() Substituir
re.split() Dividir
re.compile() Padrão reutilizável
re.match() Só no início da string
Padrão Significado
\d, \w, \s Dígito, alfanumérico, espaço
. * + ? Qualquer, zero+, um+, opcional
[abc], [^abc] Classe, negação
() Grupo de captura
^, $, \b Âncoras

Regex parece assustador no início, mas com prática vira uma ferramenta indispensável. Comece pelos padrões simples e vá evoluindo.

Continue lendo

Compartilhar