Python · SDK + algoritmo

Gerador de Placa Mercosul em Python

Pra gerar placa Mercosul válida em Python (formato LLLNLNN da Resolução CONTRAN 729/2018), instale pip install fakeforge-br e chame FakeForge().placa(n). As letras nunca incluem I, O ou Q, seguindo a regra visual do DENATRAN. Sem SDK, um regex mais random.choice replica a lógica offline.

TL;DR

pip install fakeforge-br

from fakeforge import FakeForge
placas = FakeForge().placa(100)  # 100 placas Mercosul válidas

Rota 1: SDK oficial fakeforge-br

from fakeforge import FakeForge

ff = FakeForge()

# 100 placas Mercosul (LLLNLNN)
placas = ff.placa(100)
print(placas[0])  # "ABC1D23"

# 50 placas no formato antigo (LLL-NNNN)
placas_antigas = ff.placa_antiga(50)
print(placas_antigas[0])  # "ABC-1234"

Vantagens: os dois formatos numa chamada, bulk até 10k, letras já filtradas conforme regra DENATRAN. Requer internet.

Rota 2: algoritmo local (offline)

# gerador_placa.py - implementação pura, offline
import random
import re

LETRAS_VALIDAS = list("ABCDEFGHJKLMNPRSTUVWXYZ")  # sem I, O, Q

REGEX_MERCOSUL = re.compile(r"^[A-HJ-NP-Z]{3}[0-9][A-HJ-NP-Z][0-9]{2}$")
REGEX_ANTIGA = re.compile(r"^[A-HJ-NP-Z]{3}[0-9]{4}$")


def gerar_placa_mercosul() -> str:
    """Gera placa Mercosul (LLLNLNN) conforme Resolução CONTRAN 729/2018."""
    letras = "".join(random.choices(LETRAS_VALIDAS, k=3))
    d1 = random.randint(0, 9)
    letra_meio = random.choice(LETRAS_VALIDAS)
    d2 = random.randint(0, 9)
    d3 = random.randint(0, 9)
    return f"{letras}{d1}{letra_meio}{d2}{d3}"


def gerar_placa_antiga() -> str:
    """Gera placa no formato legado (LLL-NNNN)."""
    letras = "".join(random.choices(LETRAS_VALIDAS, k=3))
    numeros = "".join(str(random.randint(0, 9)) for _ in range(4))
    return f"{letras}-{numeros}"


def validar_placa(placa: str) -> str | None:
    """Retorna 'mercosul', 'antiga' ou None se inválida."""
    limpa = placa.replace("-", "")
    if REGEX_MERCOSUL.match(limpa):
        return "mercosul"
    if REGEX_ANTIGA.match(limpa):
        return "antiga"
    return None

Vantagens: zero deps, offline, valida os dois formatos numa função só. Limitação: sem correlação com marca/modelo do veículo.

Uso em testes de ALPR (leitura de placa)

Sistemas de ALPR (Automatic License Plate Recognition) precisam aceitar os dois formatos. Um teste comum: gerar lote de placas e confirmar que o parser reconhece todas.

# tests/test_alpr_parser.py
import pytest
from fakeforge import FakeForge
from myapp.alpr import parse_placa_ocr

@pytest.fixture(scope="session")
def ff():
    return FakeForge()

@pytest.fixture
def placas_mercosul(ff):
    return ff.placa(50)

@pytest.fixture
def placas_antigas(ff):
    return ff.placa_antiga(50)


def test_alpr_parser_aceita_mercosul(placas_mercosul):
    for placa in placas_mercosul:
        resultado = parse_placa_ocr(placa)
        assert resultado is not None, f"ALPR falhou pra placa Mercosul: {placa}"


def test_alpr_parser_aceita_antiga(placas_antigas):
    for placa in placas_antigas:
        resultado = parse_placa_ocr(placa)
        assert resultado is not None, f"ALPR falhou pra placa antiga: {placa}"


def test_alpr_parser_rejeita_letra_invalida():
    placa_invalida = "ABI1234"  # I não é letra válida
    assert parse_placa_ocr(placa_invalida) is None

Comparação: qual escolher

CenárioSDK fakeforge-brAlgoritmo local
Só placa simples✅✅
Mercosul + antiga na mesma chamada✅⚠️ 2 funções separadas
Validador embutido (retorna tipo)✅✅
100% offline❌✅
Bulk 10k+✅ 1 chamada⚠️ loop
CustoFree 50/diaR$0

Perguntas frequentes

Como gerar placa Mercosul válida em Python?+

Instale pip install fakeforge-br e chame FakeForge().placa(n). Cada placa segue o formato LLLNLNN da Resolução CONTRAN 729/2018. Pra formato antigo (LLL-NNNN), use .placa_antiga(n).

As letras I, O e Q aparecem na placa gerada?+

Não. O DENATRAN exclui essas três letras por confusão visual com os dígitos 1 e 0. O SDK e o algoritmo local usam só as 23 letras válidas (A-Z exceto I, O, Q).

Dá pra gerar as duas placas (Mercosul e antiga) na mesma chamada?+

Não na mesma chamada, mas são dois métodos separados no SDK: .placa(n) pra Mercosul e .placa_antiga(n) pra formato legado.

Serve pra testar sistema de OCR ou ALPR?+

Sim. É um dos usos mais comuns: gerar um lote de placas válidas nos dois formatos e confirmar que o parser de OCR/ALPR reconhece todas, incluindo o meio-letra do Mercosul.

Próximos passos