Uso de IA no trabalho

Testar uma expressão regular escrita por IA com exemplos positivos e negativos

Trate uma regex gerada por IA como um rascunho, não como uma regra final. Monte uma pequena tabela de testes sintéticos, compare os resultados esperados com as correspondências reais, revise o padrão e salve um relatório de revisão antes de usá-lo em dados reais.

Ver o sumário

A tradução foi feita com IA. Confira o código, as unidades e os valores junto com o original. A revisão por falantes nativos de cada idioma ainda não foi concluída. English

Para quem éEste guia é para quem usa IA para criar rascunhos de expressões regulares e quer uma forma simples de testar o padrão com casos conhecidos que devem ou não corresponder.

Preparação
  • Python 3.12 e um comando de terminal que inicie essa versão.
  • Um editor de texto capaz de salvar arquivos CSV e Python em UTF-8.
  • Uma pasta de trabalho em que o script possa criar uma nova pasta dentro de outputs.
  • É necessária apenas a biblioteca padrão do Python: csv, pathlib e re.

01Escreva o requisito antes de testar a regex

Suponha que um ID interno de trabalho precise seguir o formato WK-YYYY-NNNN. O prefixo deve ser WK em maiúsculas, o ano deve estar entre 2000 e 2099, os separadores devem ser hífens e a parte final deve conter exatamente quatro dígitos ASCII.

Imagine que um assistente de IA proponha o padrão WK-\d{4}-\d{4}. Ele parece plausível, mas exige apenas quatro dígitos para o ano. Não impõe o intervalo declarado de 2000-2099. O próximo passo mais seguro não é usá-lo imediatamente, mas testá-lo com exemplos cujas respostas já são conhecidas.

02Crie um conjunto sintético de casos de teste

O conjunto de dados a seguir é sintético e foi criado especificamente para este artigo. Salve-o como regex_cases.csv. Ele contém três strings que devem corresponder e sete que não devem.

csv
case_id,value,should_match
C001,WK-2026-0001,yes
C002,WK-2000-0042,yes
C003,WK-2099-9999,yes
C004,WK-1999-0001,no
C005,wk-2026-0001,no
C006,WK-2026-001,no
C007,WK-2026-00001,no
C008,WK-2026_0001,no
C009," WK-2026-0001",no
C010,WK-20A6-0001,no

Os casos cobrem os limites permitidos do ano, um ano fora da faixa, prefixo em minúsculas, campos de sequência curtos e longos, separador incorreto, espaço em branco no início e um caractere não numérico no ano. São pequenos o suficiente para serem classificados manualmente antes de executar qualquer regex.

03Preveja onde o padrão da IA vai errar

O padrão de IA WK-\d{4}-\d{4} deve aceitar C001, C002 e C003. Por motivos estruturais, deve rejeitar C005 até C010. No entanto, ele também aceita C004 porque 1999 ainda é composto por quatro dígitos.

CasoEsperadoPadrão da IAResultado
C001MATCHMATCHPASS
C002MATCHMATCHPASS
C003MATCHMATCHPASS
C004NO MATCHMATCHFAIL
C005NO MATCHNO MATCHPASS
C006NO MATCHNO MATCHPASS
C007NO MATCHNO MATCHPASS
C008NO MATCHNO MATCHPASS
C009NO MATCHNO MATCHPASS
C010NO MATCHNO MATCHPASS

O padrão revisado é WK-20[0-9]{2}-[0-9]{4}. O prefixo 20 restringe o ano ao intervalo de 2000 a 2099, e [0-9] torna explícito o conjunto de dígitos pretendido. O script usa fullmatch, então toda a string de entrada precisa satisfazer o padrão.

04Compare automaticamente as correspondências esperadas e reais

Salve o script a seguir como ai_regex_check.py. Ele testa tanto a proposta da IA quanto o padrão revisado, grava todos os casos em um relatório CSV e se recusa a reutilizar uma pasta de saída existente.

python
import csv
import re
from pathlib import Path

SOURCE = Path("regex_cases.csv")
OUTPUT_DIR = Path("outputs") / "regex_check_result"
REPORT = OUTPUT_DIR / "regex_check.csv"

AI_PATTERN = re.compile(r"WK-\d{4}-\d{4}")
REVISED_PATTERN = re.compile(r"WK-20[0-9]{2}-[0-9]{4}")


def parse_expected(value: str) -> bool:
    normalized = value.strip().lower()
    if normalized == "yes":
        return True
    if normalized == "no":
        return False
    raise ValueError(f"Expected yes or no, got: {value!r}")


def label(value: bool) -> str:
    return "MATCH" if value else "NO MATCH"


def main() -> None:
    if not SOURCE.is_file():
        raise FileNotFoundError(f"Source CSV not found: {SOURCE}")
    if OUTPUT_DIR.exists():
        raise FileExistsError(f"Output folder already exists: {OUTPUT_DIR}")

    results = []
    ai_failures = 0
    revised_failures = 0

    with SOURCE.open("r", encoding="utf-8-sig", newline="") as stream:
        reader = csv.DictReader(stream)
        required = {"case_id", "value", "should_match"}
        if reader.fieldnames is None or not required.issubset(reader.fieldnames):
            raise ValueError("CSV is missing a required column.")

        for row_number, row in enumerate(reader, start=2):
            expected = parse_expected(row["should_match"])
            text = row["value"]
            ai_actual = AI_PATTERN.fullmatch(text) is not None
            revised_actual = REVISED_PATTERN.fullmatch(text) is not None
            ai_pass = ai_actual == expected
            revised_pass = revised_actual == expected

            if not ai_pass:
                ai_failures += 1
            if not revised_pass:
                revised_failures += 1

            results.append({
                "case_id": row["case_id"],
                "value": text,
                "expected": label(expected),
                "ai_actual": label(ai_actual),
                "ai_test": "PASS" if ai_pass else "FAIL",
                "revised_actual": label(revised_actual),
                "revised_test": "PASS" if revised_pass else "FAIL",
            })

    OUTPUT_DIR.parent.mkdir(parents=True, exist_ok=True)
    OUTPUT_DIR.mkdir()
    fields = [
        "case_id", "value", "expected", "ai_actual", "ai_test",
        "revised_actual", "revised_test"
    ]
    with REPORT.open("x", encoding="utf-8", newline="") as stream:
        writer = csv.DictWriter(stream, fieldnames=fields)
        writer.writeheader()
        writer.writerows(results)

    print(f"Cases: {len(results)}.")
    print(f"AI pattern failures: {ai_failures}.")
    print(f"Revised pattern failures: {revised_failures}.")
    print(f"Report: {REPORT.as_posix()}")

    if revised_failures:
        raise RuntimeError("Revised pattern still fails one or more tests.")


if __name__ == "__main__":
    main()
text
python ai_regex_check.py

05Confira o relatório esperado

Há 10 casos de teste. O padrão de IA deve falhar em exatamente um caso, C004. O padrão revisado deve passar nos 10 casos.

MedidaValor esperado
Casos10
Falhas do padrão da IA1
Falhas do padrão revisado0
Caso de falha da IAC004
Casos aprovados pelo padrão revisado10

A saída esperada do console abaixo foi derivada manualmente a partir da tabela de testes e do script. Não é um log capturado de execução.

text
Cases: 10.
AI pattern failures: 1.
Revised pattern failures: 0.
Report: outputs/regex_check_result/regex_check.csv

06Adicione casos de limite e reconheça erros comuns

  • Inclua limites mínimos e máximos válidos, como 2000 e 2099 neste exemplo.
  • Inclua pelo menos um valor logo fora do limite, como 1999.
  • Teste uso incorreto de maiúsculas e minúsculas, separadores, comprimentos de campo, espaços em branco e caracteres inválidos.
  • Use fullmatch quando o requisito disser que toda a string deve seguir o formato.
  • Execute o script novamente sem alterar OUTPUT_DIR. Ele deve parar com FileExistsError em vez de sobrescrever o relatório anterior.
ErroPor que isso importa
Testar apenas strings que devem corresponderUma regex permissiva demais pode parecer correta até que um exemplo negativo seja testado.
Usar um padrão de IA sem reformular o requisitoO padrão pode resolver um problema ligeiramente diferente daquele que você pretendia.
Verificar apenas um exemplo normalErros de limite, comprimento, uso de maiúsculas e minúsculas e separadores continuam sem teste.
Usar search em vez de fullmatch para uma regra de campo inteiroUma substring aparentemente válida pode ser encontrada dentro de um valor que, como um todo, é inválido.
Alterar as respostas esperadas depois de ver a saída da regexO teste deixa de funcionar como uma especificação independente do comportamento exigido.

07Entenda o que o teste de regex não comprova

Passar nesses 10 testes mostra apenas que o padrão revisado se comporta corretamente nesses 10 exemplos sintéticos. Isso não prova matematicamente que toda entrada possível será tratada corretamente. Adicione casos sempre que um novo limite ou modo de falha for descoberto.

Uma regex também valida sintaxe, não a verdade do negócio. WK-2026-1234 pode corresponder perfeitamente mesmo que esse ID não exista no seu banco de dados. Existência, unicidade, autorização e relações com outros campos exigem verificações separadas.

Este pequeno exemplo não avalia o desempenho com entradas muito longas ou adversariais. Padrões mais complexos gerados por IA devem ser revisados quanto à correção e ao comportamento em tempo de execução antes de serem colocados em serviços que processam texto não confiável.

Registro de execução e verificação

2026-09-20 · exemplo verificado manualmente · alvo: Python 3.12 · biblioteca padrão: csv, pathlib, re · sem execução

  • Foram classificados manualmente 3 valores sintéticos como correspondências esperadas e 7 como não correspondências esperadas.
  • Foi verificado manualmente que o padrão da IA aceita C004 porque 1999 satisfaz a parte de quatro dígitos do ano.
  • Foi determinado manualmente que o padrão da IA tem 1 teste com falha entre 10.
  • Foi verificado manualmente que a parte revisada do ano 20[0-9]{2} aceita de 2000 a 2099 e rejeita o exemplo 1999.
  • O script foi inspecionado quanto ao uso de fullmatch, comparação entre esperado e real, proteção contra colisão de saída e geração de relatório.
  • As contagens de falhas esperadas e a saída do console foram derivadas manualmente.
Limites da verificação
  • O autor desta resposta não executou o código; o comportamento das regex do Python e a saída do sistema de arquivos não foram testados aqui.
  • Apenas os 10 casos sintéticos listados foram avaliados manualmente; não foi estabelecida uma correção exaustiva.
  • O desempenho com strings muito longas ou adversariais não foi testado.
  • As URLs da documentação oficial foram fornecidas a partir de locais conhecidos, mas não foram verificadas em tempo real.

Princípios de redação e verificação de todo o site

Fontes de referência

As explicações e os exemplos são de elaboração própria. Os comportamentos e conceitos relacionados podem ser consultados nas fontes oficiais abaixo.