Проверка старых стандартных бразильских и меркосурских автомобильных номеров на Django

Я пытаюсь проверить бразильские плиты в Django (Python) как для старого стандарта ABC2546, так и для стандарта Mercosul ABC1A35. Но когда я ввожу стандарт Mercosur на недействительной плите.

def validate_placa(placa):
    """
    Valida se a placa do veículo está no formato correto.

    Args:
        placa (str): A placa do veículo a ser validada.

    Returns:
        None se a placa for válida, uma mensagem de erro se não for.
    """
    placa_regex = r'^[A-Z]{3}-[0-9]{4}$|^([0-9]{3})-([0-9]{3})([A-Z]{1})$'
    # Formato: ABC-1234
    validator = RegexValidator(regex=placa_regex, message='Placa inválida.')
    try:
        validator(placa)
    except ValidationError as error:
        return error.message
class ClienteForm(forms.ModelForm):
    class Meta:
        model = Cliente
        fields = '__all__'

    veiculo_placa = forms.CharField(
        validators=[validate_placa],
        max_length=8,
        error_messages={'required': 'Placa é obrigatória.'}
    )

    def validate_data(self, data):
        cleaned_data = super().validate_data(data)
        veiculo_placas = self.data.getlist('veiculo_placa')

        for placa in veiculo_placas:
            error_message = validate_placa(placa)
            if error_message:
                self.add_error('veiculo_placa', error_message)

        return cleaned_data
    

Мне нужно подтвердить оба стандарта

Похоже, что проверка regex для Mercosul неверна. Нужны ли скобки?

Правильный regex (без символов "-") должен выглядеть примерно так:

^[a-zA-Z]{3}[0-9][A-Za-z0-9][0-9]{2}$

Вы можете использовать онлайн-инструменты для проверки ваших regex или даже chatGPT способен проверить и сгенерировать их для вас.

Надеюсь, это поможет!

Используйте скобки, так:

placa_regex = r'^([A-Z]{3}[0-9]{4}|[A-Z]{3}[0-9][A-Z][0-9]{2})$'

Таким образом, стандарт Mercosur для Бразилии [wiki] состоит из трех символов A-Z, одной цифры, одного символа A-Z и двух цифр.

Вернуться на верх