Какие правила по имени и фамилии: допускается только кириллица или латиница
Что проверяют
Умеете ли вы превратить расплывчатое требование «только кириллица или латиница» в точную спецификацию, которая не отсечёт реальных людей. Следом обычно просят набросать тест-кейсы или спрашивают, можно ли смешивать алфавиты в одном поле.
Как отвечать
Начните с уточнения правил, код пишется потом:
- алфавит: поле целиком на одном алфавите или допускается смесь. «Ivanов» чаще ошибка раскладки или подмена гомоглифами (латинская «a» и кириллическая «а» выглядят одинаково), поэтому обычно требуют один алфавит на поле;
- разделители: дефис в двойных фамилиях (Салтыков-Щедрин), апостроф (O’Connor), пробел в составных именах. Разрешать их только между буквами, не в начале, не в конце и не подряд;
- буква ё: диапазон
а-яеё не включает,ёиЁлежат в Unicode за его пределами; - нормализация:
strip()по краям иunicodedata.normalize("NFC", name), иначе «й», набранная двумя кодовыми точками, не пройдёт проверку; - длина и регистр: границы длины и решение, храним как ввели или приводим к единому виду.
В Python правило выглядит так: re.fullmatch(r"[А-Яа-яЁё]+(?:[-' ][А-Яа-яЁё]+)*", name) и такой же шаблон для A-Za-z, имя валидно, если совпал один из двух. fullmatch надёжнее связки re.match с ^...$. В Pydantic то же правило оформляется через field_validator с понятным текстом ошибки для пользователя.
Проверка обязательно дублируется на сервере: клиентскую обходят одним запросом мимо формы.
Где спотыкаются
Пишут [а-яА-Яa-zA-Z]+. Такой шаблон отвергает дефис, апостроф и «ё», зато пропускает смешанное «IvanИван».
Не знают, что $ в Python совпадает и перед завершающим переводом строки, поэтому re.match(r"^[А-Яа-я]+$", "Иван\n") вернёт совпадение. Ещё одна ловушка: \w в Python 3 пропускает цифры, подчёркивание и буквы любых алфавитов.
Не задают вопрос о смысле требования. Если сервисом пользуются иностранцы, запрет на остальные алфавиты отсекает реальных клиентов, и это стоит сказать вслух, а не молча реализовать.