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
- Troque apenas
A001pora001no texto. A primeira correspondência desaparece, masB002 8000e a data continuam sendo impressos. A busca não informa automaticamente que perdeu um registro. Restaure a letra maiúscula. - Troque
3500por-1. O parA001:-1não corresponde porque o padrão exige dígitos imediatamente após os dois-pontos. O segundo registro continua presente. Restaure3500. - Troque a data por
2026-02-30. As duas linhas de registros aparecem antes deValueError: o erro acontece na interpretação da data, depois da extração. Restaure a data e confirme as três linhas originais. - 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.




