Python Regex explicado (2026)
Regex é o recurso mais temido do Python. Não é tão difícil - mas 80% dos tutoriais carregam a teoria antecipadamente (\d, \w, ganancioso vs preguiçoso) antes de mostrar um único padrão que você realmente usaria em código real. Este tutorial inverte isso.
Abordaremos: os fundamentos do módulo re, os cinco padrões que cobrem 90% do trabalho real, quando re.compile realmente ajuda, grupos nomeados versus numerados e os quatro casos em que regex é a ferramenta ERRADA.
O módulo em 60 segundos
Tudo reside no módulo stdlib re. Três funções cobrem a maioria das necessidades:
Regra: use re.search em caso de dúvida. re.match apenas verifica o início; esquecer isso leva a "meu regex não corresponde!" 30 minutos perdidos.
Strings brutas — sempre use-as
O prefixo r"..." desativa a interpretação de barra invertida. Sem ele, "\d" se torna "\\d" em Python, que o mecanismo regex vê como \d — mesmo resultado, mas apenas por acidente e apenas para \d. "\n" em uma regex é uma nova linha, não os dois caracteres ` + n`.
Memória muscular: todo literal regex começa com r. Sem exceções.
Os 5 padrões que cobrem 90% do trabalho real
1. Extraia todos os números inteiros do texto
Observe que 199.99 se divide em ['199', '99'] — \d+ não cruza o ponto. Use r"\d+(?:\.\d+)?" para decimais opcionais:
2. Normalizar espaços em branco
\s+ corresponde a qualquer sequência de espaços/tabulações/novas linhas. Substitua por um único espaço, retire as bordas. Esta é a resposta do Python para sed -E 's/[[:space:]]+/ /g'.
3. Extraia o nome do host de uma URL
Os parênteses criam um grupo de captura; .group(1) retorna seu conteúdo. [^/:]+ = "um ou mais caracteres que não são / ou :" — para no separador de porta OU no caminho.
Para análise de URL de produção, use urllib.parse.urlparse (lida com casos extremos como userinfo + IPv6). Regex é para extração rápida e suja.
4. Validação de e-mail frouxa
NÃO existe regex que valide totalmente e-mails de acordo com RFC 5322. Qualquer pessoa que disser o contrário está vendendo algo. Mas este captura 99% dos endereços reais sem rejeitar falsamente os bons:
Âncoras (^ e $) forçam a correspondência de string completa. Sem eles, "foo@bar" dentro de uma frase maior corresponderia.
Produção: envie um email de confirmação. Esse é o ÚNICO validador de e-mail confiável.
5. Grupos de captura nomeados
Grupos numerados ((...) + .group(1)) são adequados para 2-3 capturas. Além disso, os nomes ganham:
.groupdict() retorna um dict de todos os grupos nomeados. Adicione/reordene grupos sem quebrar todos os sites de chamada que se referem a .group(3).
re.compile — quando realmente ajuda
O stdlib mantém um pequeno cache de padrão compilado (tamanho padrão 512), portanto chamadas re.search(pattern, text) únicas são efetivamente gratuitas após o primeiro hit. re.compile ajuda explicitamente quando:
1. O padrão é usado dentro de um laço apertado (milhões de fósforos).
2. Você deseja armazenar o padrão como uma constante de nível de módulo para capacidade grep.
3. Você precisa de .finditer(), .pattern, .flags no objeto compilado.
Não compile demais. Cada re.compile em nível de módulo adiciona um pequeno custo de tempo de importação.
Sinalizadores comuns
Combine com |: re.IGNORECASE | re.MULTILINE.
Quando regex é a ferramenta ERRADA
1. Analisando HTML/XML → use um analisador real
A resposta clássica do Stack Overflow para isso tem 20 anos e ainda é verdadeira.
2. Analisando JSON → use json
O módulo json lida com aspas aninhadas, caracteres de escape, Unicode e todos os casos extremos RFC 8259. JSON de análise de Regex é um sinal antipadrão.
3. Analisando datas → use dateutil ou datetime.strptime
dateutil.parser.parse("2026-07-30") aceita todos os formatos que um ser humano possa digitar. datetime.strptime lida com formatos conhecidos de forma eficiente. Ambos lidam com fusos horários. Regex precisaria reinventar tudo isso.
4. Padrões aninhados/recursivos → use um gerador de analisador
Parênteses combinados, JSON aninhados e expressões balanceadas estão formalmente além do poder do regex (território de gramática livre de contexto). Use pyparsing / lark / ANTLR — ou apenas percorra a string com um pequeno analisador.
Depurando regex
Use regex101.com (escolha o sabor "Python"). Cole o padrão + texto de amostra; destaca as correspondências em tempo real, explica cada metacaractere e mostra grupos nomeados. A maneira mais rápida de aprender regex intuitivamente.
Para depuração em nível de código, re.DEBUG imprime a máquina de estado compilada:
Prática
Escreva um regex para cada um. Soluções abaixo.
1. Extraia o número da versão de "Python 3.13.2 (main, Jan 15 2026, 10:32:11)" — deve retornar "3.13.2".
2. Divida "apple,banana; cherry orange" em qualquer delimitador (,, ; ou espaço).
3. Reescreva foo.bar_baz-123 como FOO.BAR_BAZ-123 (apenas letras maiúsculas, deixe dígitos e pontuação).
Soluções:
Regex é um superpoder quando você ultrapassa os 10 primeiros padrões. O truque é construir memória muscular com base nos cinco itens acima – eles cobrem 90% do trabalho real. Procure um analisador real no momento em que estiver escrevendo referências anteriores para equilibrar parênteses.
Próxima etapa: aulas de regex + processamento de texto na faixa Automação — pratique em arquivos de log, dados CSV e tarefas de web scraping com Python real em execução no seu navegador.