Curso de Python / Buscar e validar padrões com expressões regulares

Expressões regulares, também chamadas de regex, encontram padrões em um texto ou verificam seu formato completo. Uma correspondência não garante que o valor seja válido para a aplicação: uma data pode ter o formato esperado e ainda indicar um dia inexistente.

Escolher entre busca e validação completa

Operação Uso Cuidado
re.search Encontrar uma parte correspondente em qualquer posição O restante do texto pode estar fora do padrão
re.fullmatch Exigir que toda a string corresponda Ainda é necessário interpretar e validar o significado
re.finditer Percorrer correspondências com seus campos e posições Trechos não reconhecidos podem ser ignorados

Um filtro que procura números em uma descrição e um formulário que aceita somente um número têm contratos diferentes. Por exemplo, procurar dígitos em abc123xyz encontra 123; exigir correspondência completa com o mesmo padrão rejeita a string.

Use normalmente strings brutas, como r"[0-9]+", para reduzir a confusão entre escapes da linguagem e do padrão. O prefixo r não elimina as regras do literal Python: uma string bruta não pode terminar com uma única contrabarra. A referência do módulo re descreve a sintaxe e as operações.

Extrair campos nomeados e interpretar uma data

Crie uma pasta de prática e salve o programa completo abaixo como regex_demo.py, em UTF-8. O exemplo usa apenas a biblioteca padrão; nenhum pacote adicional precisa ser instalado. Execute python regex_demo.py no terminal do ambiente virtual selecionado. Fora dele no macOS ou Ubuntu, use python3 se esse for o nome do seu interpretador.

import re
from datetime import date

text = "A001:3500 B002:8000"
pattern = re.compile(r"(?P<id>[A-Z][0-9]{3}):(?P<amount>[0-9]+)")
for match in pattern.finditer(text):
    print(match["id"], int(match["amount"]))
value = "2026-10-17"
if re.fullmatch(r"[0-9]{4}-[0-9]{2}-[0-9]{2}", value):
    print(date.fromisoformat(value))

Resultado esperado:

A001 3500
B002 8000
2026-10-17

[A-Z] exige uma letra ASCII maiúscula; [0-9]{3} exige exatamente três algarismos após ela; os dois-pontos são literais. [0-9]+ aceita um ou mais algarismos para o valor. Os grupos (?P<id>...) e (?P<amount>...) dão nomes aos campos. Cada objeto match permite recuperar esses campos, e int converte a quantia extraída em inteiro.

O padrão é compilado uma vez e aplicado com finditer ao texto que contém dois registros. Não há validação do texto completo nem dos separadores entre registros. Se a entrada precisar ser um único par identificador–valor, use um contrato próprio com correspondência completa; não trate a extração parcial como prova de que todos os caracteres foram aceitos.

Tratar ausência de correspondência e valores impossíveis

Uma busca sem resultado devolve None. Depois de match = re.search(r"[0-9]+", "no digits"), verifique if match is not None: antes de chamar match.group(). Sem essa verificação, o programa tenta acessar um método que não existe em None e gera AttributeError. A ausência pode ser um caso normal de entrada, e não uma falha inesperada.

O padrão da data verifica quatro dígitos, hífen, dois dígitos, hífen e dois dígitos. Ele aceita tanto 2026-02-30 quanto 2026-99-99. A chamada seguinte a date.fromisoformat rejeita essas datas com ValueError. Em um formulário, separe a mensagem de formato incorreto da mensagem de data inexistente quando essa distinção ajudar o usuário a corrigir o dado.

Esse processo combina a verificação do formato com a interpretação de datas com datetime. Para o comportamento do conversor, consulte date.fromisoformat na documentação oficial. Uma regra adicional, como proibir datas futuras, pertence à aplicação e não está implementada no exemplo.

Também não use uma única regex para interpretar toda a estrutura de HTML ou um CSV com aspas, separadores e quebras de linha. Use um analisador próprio do formato; uma expressão regular pode ser útil depois, em um campo textual já extraído.

Experimentar os limites do padrão

  1. Troque apenas A001 por a001 no texto. A primeira correspondência desaparece, mas B002 8000 e a data continuam sendo impressos. A busca não informa automaticamente que perdeu um registro. Restaure a letra maiúscula.
  2. Troque 3500 por -1. O par A001:-1 não corresponde porque o padrão exige dígitos imediatamente após os dois-pontos. O segundo registro continua presente. Restaure 3500.
  3. Troque a data por 2026-02-30. As duas linhas de registros aparecem antes de ValueError: o erro acontece na interpretação da data, depois da extração. Restaure a data e confirme as três linhas originais.
  4. Acrescente letras depois do valor de um registro e observe que a busca pode reconhecer somente o prefixo numérico. Decida se sua tarefa permite extrair esse prefixo ou se exige rejeitar o campo inteiro.

Além das regras de negócio, limite o tamanho da entrada e mantenha controle sobre os padrões executados. Repetições aninhadas e alternativas ambíguas podem consumir tempo excessivo em entradas desfavoráveis; não execute expressões fornecidas por terceiros indiscriminadamente. Compilar o padrão organiza seu uso, mas não garante que qualquer expressão seja rápida ou segura.