Собеседование производилось на позицию Python разработчика, было очень весело и классно.
Решение:
Больше в голову ничего не лезло. Попросили придумать вторую регулярку....ничего не придумал, но на идею меня потом натолкнули. Она чертовски классная!
Основана она на Законах Де Моргана и по идее выполняется более быстро. Встречайте:
Для поста я ее писал очень долго, не получалось внести последнее условие под "знак НЕ", в итоге так и не получилось и я бросил это занятие. Может быть даже и накосячил в этой.
В связи с моей недоработкой предлагаю вам внести крайнее условие под "знак НЕ" и предложить еще способы решения этой задачи. Пишите в комменты!
Другие части цикла: #1 #2 #3 #5
Вопрос взят с тестовых заданий Yandex.
Задача:
В системе авторизации есть ограничение — логин должен начинаться с латинской буквы, он может состоять из латинских букв, цифр, точки и минуса, но заканчиваться только латинской буквой или цифрой; минимальная длина логина составляет 1 символ, максимальная — 20 символов. Пожалуйста, напишите код, проверяющий соответствие входной строки этому правилу. Придумайте несколько способов решения задачи и сравните их.
Я придумал только два способа, проверка условий if-ами и обычное регулярное выражение, аля
^(\w[\w\d\.-]{0,18}[\w\d]|\w)$
Больше в голову ничего не лезло. Попросили придумать вторую регулярку....ничего не придумал, но на идею меня потом натолкнули. Она чертовски классная!
Основана она на Законах Де Моргана и по идее выполняется более быстро. Встречайте:
^(?![^a-zA-Z].*$|.*[^a-zA-Z\d]$|.{21,}$)(?=[a-zA-Z\d\.\-]*$)
Для поста я ее писал очень долго, не получалось внести последнее условие под "знак НЕ", в итоге так и не получилось и я бросил это занятие. Может быть даже и накосячил в этой.
В связи с моей недоработкой предлагаю вам внести крайнее условие под "знак НЕ" и предложить еще способы решения этой задачи. Пишите в комменты!
Другие части цикла: #1 #2 #3 #5
^(\w[\w\d\.-]{0,18}[\w\d]|\w)$ - не верное выражение хотя бы потому что \w содержит и цифры тоже
ReplyDeleteвторое чуть-чуть не верно :
^(?![^a-zA-Z].*$|.*[^a-zA-Z\d]$|.{21,}$)(?=[a-zA-Z\d\.\-]*$) - не сработает если логин равен ""
^(?![^a-zA-Z].*$|.*[^a-zA-Z\d]$|.{21,}$)(?=[a-zA-Z\d\.\-]+$) - сработает для всех условий :))
А почему это должно быстрее работать?
Уфф, ну вот и косяки полезли =) может как нить и поправлю =)
DeleteБыстрее, ну расчет на то, что во втором проверяется каждое из условий по очереди, и если одно из них верно, то все выражение верно, а в первом случае не совсем известно как идет проверка. В данном случае мое заявление немного голословно, надо смотреть реализацию регулярок для питона или хотя бы провести тесты...