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.