Проверка старых стандартных бразильских и меркосурских автомобильных номеров на 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 и двух цифр.