versetty777

versetty777

Python-разработчик
Пикабушник
1715 рейтинг 155 подписчиков 0 подписок 37 постов 3 в горячем
Награды:
10 лет на Пикабу
114

Честно: большинство тех кто пишет регулярки - просто аккуратно копируют со Stack Overflow, я сам был такой

Ноябрь 2012 года, если не ошибаюсь. Может октябрь - уже не помню точно. Мне передали чужую программу т.к. человек который её писал уволился. Быстро уволился, без передачи дел. Программа собирала заявки от клиентов: имя, телефон, адрес доставки. Мне нужно было разобраться как она не пускает людей, которые вводят в поле "имя" какую-нибудь ерунду. Ну знаете - когда человек жмёт клавиши наугад или вводит пробелы. Нашёл нужное место в коде. И там было вот это:

^(?:[а-яА-ЯёЁ]{2,}[\s\-]){1,3}[а-яА-ЯёЁ]{2,}$

Я смотрел на это. Просто смотрел. Потом скопировал в гугл, что-то почитал - не особо помогло - закрыл вкладку. Написал тому кто это написал, хотя мы едва были знакомы: "слушай, а что вот это вообще?" Ответил через два дня: "а, это проверка ФИО, там всё понятно". Я написал "ясно, спасибо". Больше не спрашивал. Строчка работала и ладно. Но это меня беспокоило. Реально беспокоило, не для красного словца. Не люблю когда в коде есть что-то чужое и непонятное - особенно в том месте где пользователи вводят свои данные. Казалось что в любой момент что-то может пойти не так а я даже не пойму где смотреть.

Что это вообще такое?

Называется эта строчка регулярное выражение. Или регулярка. Некоторые говорят паттерн. Если совсем на пальцах - это способ описать форму текста а не конкретный текст. Не "найди слово Вася" а "найди любое слово из пяти букв которое начинается на В". Или "найди строку где сначала идут одиннадцать цифр подряд" - т.е. номер телефона, неважно как именно он записан. Вот с телефонами как раз хороший пример. Допустим вам прислали базу клиентов - пять тысяч строк. И в каждой строке телефон, но записан по-разному т.к. менеджеры вносили кто как хотел:

8-916-123-45-67 +7(916)1234567 89161234567 8 916 123 45 67

Это всё один и тот же номер. Вы это понимаете сразу. Компьютер - нет. Для него это четыре разные строки которые вообще не похожи друг на друга. Без регулярок тут либо руками, либо пишешь условие для каждого варианта. Потом находишь пятый вариант которого не учёл. Потом шестой. С регулярками - один шаблон, и всё.

Я с ними помирился года через три после той истории. Не потому что сел специально учить - просто задачи заставили. Разбирать логи сервера руками надоедает быстро. Чистить таблицы с кривыми данными вручную - тем более. Когда наконец разобрался - немного обидно стало. Там не так много всего. Символов которые реально нужны - штук пятнадцать, наверное. Большинство задач решаются вообще пятью-шестью. Точка означает "любой один символ". Звёздочка - "предыдущее встречается сколько угодно раз". Значок ^ в начале - "строка начинается здесь". $ в конце - "строка здесь заканчивается". \d - "любая цифра". Это не шифровка - это просто другой алфавит с другими значениями. Привыкаешь быстро.

Есть один момент который меня в своё время поставил в тупик. Регулярки бывают жадными. Это официальный термин, не придуманный. Когда говоришь "найди всё что между словом А и словом Б" - по умолчанию берётся максимум. Если слово Б встречается в тексте три раза - дотянется до последнего. Не до первого. Вот представьте строку с жалобами жильцов - всё в одну строку, так бывает в выгрузках:

жалоба: шум в подъезде жалоба: вода холодная жалоба: Олег с третьего

Хочешь найти что написано в первой жалобе. Ожидаешь получить "шум в подъезде". Получаешь всё от начала до последней "жалоба:", т.е. почти всю строку. Потому что жадно. Лечится одним символом - вопросительным знаком в нужном месте. Было "бери максимум" - стало "бери минимум, стоп при первом совпадении". Называется ленивый режим. Жадный и ленивый - два режима, один символ разницы. Я это понял не из учебника. Я это понял когда регулярка вернула мне половину лог-файла вместо одной строки которую я искал. Минут двадцать смотрел что не так.

В Питоне регулярки работают через модуль который называется re. Подключаешь одной строчкой и дальше либо ищешь все совпадения в тексте, либо заменяешь найденное на что-то другое, либо просто проверяешь есть такое в строке или нет. Выглядит это примерно так. Вот реальная ситуация которая случается часто: выгрузка из какой-то системы, строки с ошибками вперемешку с нормальными строками. Нужны только ошибки.

2024-01-15 ОШИБКА Иванова: дубликат записи

2024-01-16 ОК Петров: данные обновлены

2024-01-17 ОШИБКА Сидорова: неверный формат даты

2024-01-18 ОК Кузнецов: обновлено

2024-01-19 ОШИБКА Олег: снова что-то пошло не так

Для обработки пишу такой код

import re

errors = re.findall(r"^\d{4}-\d{2}-\d{2} ОШИБКА.*$", data, re.MULTILINE)

Читается примерно так: найди строки которые начинаются с даты - четыре цифры, дефис, две цифры, дефис, две цифры - потом идёт слово ОШИБКА, потом что угодно до конца строки. Всё остальное пропусти. Результат: три строки с ОШИБКА. Строки с ОК не попали. Одна строка вместо цикла с кучей условий.

Если вы никогда не видели Питон и непонятно что там написано - import re это просто "подключи инструмент для регулярок", без этого ничего не работает. re.findall - найди всё что подходит и верни списком. Остальное пока не важно.

Вернёмся к загадочной строчке из начала поста:

^(?:[а-яА-ЯёЁ]{2,}[\s\-]){1,3}[а-яА-ЯёЁ]{2,}$

Сейчас я читаю эту строчку примерно так: строка начинается и заканчивается кириллическими буквами, каждая часть минимум два символа, между частями пробел или дефис, таких частей от одной до трёх. Т.е. это проверка ФИО. Иванов Иван Иванович - пройдёт. "абракадабра" - нет. Пробелы - нет. Одна буква - нет. 3 минуты ступора тогда, 30 сек сейчас. Разница только в том что я теперь знаю что означают символы.

Я учил регулярки по кускам. Что-то из документации, что-то с Stack Overflow, что-то методом тыка - написал, не работает, поменял, заработало, не очень понял почему. Так и накапливалось. Это нормальный способ, я не жалуюсь. Но медленный. И каждый раз когда кто-то из коллег спрашивал "объясни как это работает" - я объяснял одно и то же. И каждый раз чувствовал что объясняю как-то криво. Не потому что сам не понимаю, а потому что под рукой не было нормального места куда можно было бы отправить человека. Есть доки - но они для тех кто уже знает. Есть статьи, но они на два часа, после которых всё равно идёшь в гугл.

Со временем я сделал курс. Провозился дольше, чем планировал, но зато сделал его так, как сам хотел бы проходить. Плюс справочники, я сам ими пользуюсь т.к. всё наизусть не помню. Не знаю подойдёт ли именно вам. Если просто хотели понять что такое регулярки и почему они выглядят как шифровка - надеюсь этот пост помог. Написал 72 урока и более 900 задач. 900, Карл! Теперь вижу регулярки во сне - это уже не лечится 🙃 Первые 7 уроков открыты, добро пожаловать в секту: Регулярные выражения (Regex) в Python: Интерактивный тренажер

И последнее. Вот строка из реальной почты, такое приходит, когда коллега пересылает что-то важное простым текстом:

Встреча с Ивановым перенесена. Новое время: 14:30.

Попробуйте написать шаблон, который вытащит из этой строки только время - «14:30». Две цифры, двоеточие, две цифры. Казалось бы, вроде бы просто, но интересно, как вы это запишете на языке регулярок. Пишите варианты в комментариях, позже разберём. Рабочих решений несколько, посмотрим, кто до каких доберётся 🙂

Показать полностью 4
13

Продолжение поста «Как я стал Python-разработчиком»6

Создаём простую игру "Угадай число", в которой компьютер загадывает число, а игрок должен угадать его за наименьшее количество попыток.

Открываем любой редактор кода, например, online-python.com. Для создания игры мы будем использовать модуль random в Python. Модуль random генерит случайное число, которое будет загадано компьютером. Вот как будет выглядеть наш код для загадывания числа:

В этом коде мы импортируем модуль random и метод randint(), чтобы сгенерировать случайное число от 1 до 100.

Далее пишем код для получения ответа игрока и его проверки. Для этого мы будем использовать цикл while, который будет выполняться до тех пор, пока игрок не угадает верное число:

Сначала мы запрашиваем ответ игрока с помощью функции input(). Затем мы запускаем цикл while. Если ответ игрока неверный, мы выводим подсказку и просим ввести число еще раз. Если ответ игрока правильный, мы выводим сообщение об этом и завершаем игру.

Теперь мы можем запустить нашу игру и начать играть! Вот что должно получиться:

Как видите, ничего особо сложного нет, а для того, чтобы самому написать такую программу, достаточно изучить основы языка. Список годных материалов я на писал в посте поста «Как я стал Python-разработчиком» :)

Показать полностью 2
1031

Продолжение поста «Как я стал Python-разработчиком»6

Как изучить Python с нуля: самый лёгкий способ

Хочу рассказать о хорошем способе изучения Python’а для абсолютных новичков в программировании. Большой плюс языка состоит в том, что по Пайтону много полезной литературы, в отличие от того же JavaScript. Но много интересных материалов опубликовано на английском языке, поэтому даже для самого программирования нужно владеть хотя бы основами английского.

В посте я буду рассматривать литературу на русском языке.

В первую очередь возьмите в руки отличную книгу Марка Лутца под названием “Изучаем Python”, 4 издание. Есть ещё и 5 издание, но, как мне показалось, оно очень плохо переведено на русский.  Параллельно читаем ещё одну книгу этого автора “Программирование на Python”, тоже 4 издание. Первая книга поможет вам получить всю необходимую теоретическую базу по языку в доступной форме, а вторая научит вас применять все полученные знания в ваших пет-проектах. По моему мнению, достаточно этих двух книг, они содержат всё, что нужно знать, чтобы начать программировать с нуля.

Про официальную документацию писать не буду, так как она написана на английском. На сайте Digitology.tech выложен полный перевод документации по языку Python, который включает в себя: учебник, документация по модулям стандартной библиотеки, справочник по синтаксису и многое другое.

Если вы больше воспринимаете информацию по видеоурокам, то открывайте видеоканал Тимофея Хирьянова, преподавателя кафедры информатики МФТИ. Очень крутой препод, подача отличная. Очень легко подаёт материал. Не нервничает, не нудит, не теряется, говорит чётко, ясно. Хорошо просматривается цепочка повествования вообще. Приятно слушать. Очень доходчиво объясняет достаточно сложный для восприятия предмет на стыке достаточно сложных предметов: математики (логика, теория графов), устройства ЭВМ, синтаксиса и грамматики языка. Очень хорошо воспринимается с нуля даже начинающими слушателями за счет объяснения на сравнительных примерах из жизни.

Если хочется больше практики, то изучите материалы из моего поста, под которым я опубликовал этот комментарий-пост. Материалов много, поэтому вы сможете найти для себя подходящие задачки / курсы.

P.S. Добавьте в закладки следующие сайты, они вам будут крайне полезны в начале вашего пути:

  • https://metanit.com/python/tutorial - хорошее практическое руководство для новичков.

  • https://ru.stackoverflow.com/ - огромное сообщество программистов. Если столкнётесь с трудностями при решении задач, то смело задавайте свой вопрос. Главное – напишите, что именно вы сделали и почему это не сработало.

Дерзайте! Всем удачи.

UPD:

Курс по регулярным выражениям - полезная штука, помогает сократить код в разы, да и на собесах оценят знания

Показать полностью
2

Продолжение поста «Как я стал Python-разработчиком»

Забавные и малоизвестные факты о языке Python :)

  1. Python - это язык программирования для тех, кто не любит писать код. Это одна из самых известных шуток про Python связана с его простым синтаксисом. Поэтому его часто называют языком для тех, кто не любит писать код. Но не стоит забывать, что простой синтаксис не делает Python менее мощным языком программирования.

  2. Python - это язык, который имеет свой собственный философский подход. Он называется "The Zen of Python", который описывает некоторые из основных принципов, которые следует придерживаться при разработке на Python. Например, одним из главных принципов является "Простое лучше, чем сложное". Это означает, что простой код, который легко читается и понимается, он предпочтительнее, чем сложный и запутанный код.

  3. Язык Python - это как котенок: он забавный и милый, но он может укусить, если вы его не обучите. Действительно, Python может быть интуитивно понятным языком, но если вы не будете соблюдать правила синтаксиса и не будете использовать правильные практики программирования, то вы можете получить нежелательный результат.

  4. Знаете ли вы, как определить программиста на Python на улице? Он будет говорить о том, как быстро он написал свою программу. Язык Python может быть очень эффективным языком программирования, который позволяет реально быстро создавать приложения и игры. Однако, как и в случае с любым другим языком программирования, это не всегда означает, что программа будет хорошо написана :)

  5. Python - это язык, который не требует от вас быть гением в математике, но он поможет вам им стать. Python помогает легко работать с математическими вычислениями и анализом данных благодаря мощным библиотекам, таким как NumPy, SciPy и Pandas. На практике так и есть, Python действительно может помочь программистам улучшить свои знания в области математики.

  6. Python - это язык программирования, который не связан со змеёй, но мы все равно называем его Python. Эта шутка - игра слов. Несмотря на то, что язык был назван в честь телепередачи Монти Пайтона, змея Питон на самом деле не имеют никакого отношения к языку программирования.

  7. Какой язык программирования наиболее часто используют панды? Python, конечно! Шутка отсылает к одной из самых популярных библиотек на языке Python - Pandas, которая используется для анализа данных. Панды обязательно бы выбрали Python в качестве своего любимого языка программирования :)

  8. Программисты не говорят, что у них есть проблема. Они называют это Python'ом. Шутка отсылает к тому, что язык может стать зависимостью для программистов. Да-да, так и есть. Все больше программистов начинают использовать Python в своих проектах. Но применение Python может привести к тому, что программисты начнут зависеть от этого языка и столкнуться с проблемами, если придется работать с другими языками типа C++ или Java.

  9. Если вы не знаете, как решить проблему с помощью регулярных выражений, то у вас теперь две проблемы. Эта шутка отражает сложности работы с регулярными выражениями, которые могут быть довольно трудными для понимания и написания. Вместо того, чтобы использовать регулярные выражения, можно использовать более простые методы для работы с текстом в Python.

Показать полностью
73

Продолжение поста «Как я стал Python-разработчиком»6

Расскажу о самых популярных вопросах, которые обязательно зададут на собеседовании по Python для джунов. Именно эти вопросы мне в своё время задавали на собеседовании, поэтому читаем и сохраняем себе на будущее. Ещё были задачки, но о них напишу чуть позже.

В чем разница между списком и кортежем? Ответ: список объявляется в квадратных скобках и может быть изменен, в то время как кортеж объявляется в скобках и не может быть изменен.

Как выполняется интерполяция строк? Ответ: интерполяция строк в Python позволяет вставлять значения переменных внутрь строки. Для выполнения интерполяции используется символ % и кортеж значений, которые нужно вставить в строку. Пример:

Что такое декоратор? Ответ: это функция в Python, которая позволяет добавить новую функциональность к существующей функции. Пример, где декоратор my_decorator принимает функцию func в качестве аргумента и возвращает новую функцию wrapper:

Что такое функция range? Ответ: функция range используется для создания последовательности чисел. Она принимает 3 аргумента: начальное значение, конечное значение и шаг. Например, для создания последовательности чисел от 0 до 9 мы напишем такой код:

В чём разница между методами экземпляра, класса и статическими методами? Ответ:

  • Методы экземпляра - это методы, которые относятся к определённому экземпляру класса и принимают параметр self.

  • Статические методы - это методы, которые не относятся к конкретному экземпляру класса, не имеют доступа к атрибутам экземпляра и используют декоратор staticmain.

  • Методы класса - это методы, которые относятся к классу в целом, а не к конкретному экземпляру, и принимают параметр cls. Они могут изменять состояние класса, но не экземпляров класса.

В чем разница между func и func()? Ответ: fun" - это имя функции, а func() - это вызов функции.

Как работает функция reduce? Ответ: Функция reduce() принимает функцию и последовательность и обрабатывает эту последовательность. На каждой итерации функция получает текущий элемент и результат предыдущего вызова. В результате функция возвращает одно значение.

Переменные в Python передаются по ссылке или по значению? Ответ: Переменные в Python передаются по ссылке.

Как работает умножение строк? Ответ: умножение строки на число создает новую строку, которая содержит несколько копий исходной строки, разделенных между собой. Например, выражение "hello" * 3 создаст новую строку "hellohellohello".

В чем разница между списками и массивами? Ответ: основная разница между ними в том, что это разные способы хранения последовательностей. Списки (list) в питоне являются встроенным в сам язык способом хранить последовательности. А массивы (array) требуют импортировать библиотеки. В списке можно хранить элементы разных типов. В массиве только элементы одного типа, из-за чего требуется меньше памяти. У списков свои встроенные методы для работы с элементами. У массивов свои, притом в разных библиотеках разные.

Как округлить число до трех десятичных знаков? Ответ: можно использовать функцию round(), Например, чтобы округлить число 3.14159265359 до трех десятичных знаков напишем round(3.14159265359, 3).

Какая разница между словарями и JSON? Ответ: словари используются для хранения данных в памяти компьютера в Python, тогда как JSON используется для передачи данных между различными системами и языками программирования.

Список дополнительных вопросов, которые нужно задавать на собеседовании стажёру / junior'у (по моему скромному мнению):

  1. Как управляется память?

  2. Что такое PEP 8?

  3. Обязательны ли отступы?

  4. Что такое функция?

  5. Что такое локальные и глобальные переменные?

  6. Что такое лямбда-функция?

  7. Какие типы данных поддерживаются?

  8. Что такое индексы?

  9. Что такое словарь?

  10. Что такое итераторы?

  11. Что делает [:: -1}?

  12. Как можно использовать тернарные операторы?

  13. Что такое функция map?

  14. Каков смысл not в операторе?

  15. Как создать пустой класс?

  16. Как преобразовать список в строку?

  17. Как вырваться из бесконечного цикла?

  18. Когда выполняется except, в блоке try-except?

  19. Что такое модули Python?

  20. Как можно удалить переменные?

  21. Что такое генератор?

  22. Освобождается ли вся память при выходе из Python?

Показать полностью 2
6

Продолжение поста «Как я стал Python-разработчиком»6

Сегодня напишем простенькую программу на Python для расчёта индекса массы тела (ИМТ).

Откройте https://replit.com/languages/python3 и начинайте писать код в этом онлайн-редакторе.

Вот как выглядит код программы:

# Запрос роста в сантиметрах и сохранение его в переменную height_cm:

h = int(input("Введите ваш рост в сантиметрах: "))

# Запрос веса в килограммах по аналогии:

m = int(input("Введите ваш вес в килограммах: "))

Вычисляем ИМТ по формуле = m (кг) / (h (м))2, где m — масса тела в килограммах h — рост в метрах. Знак ** используется для возведения числа в степень:

imt = m / ((h / 100) ** 2) # формула ИМТ: вес / (рост в метрах в квадрате)

Самое сложное: пишем условия, где проверяем, находится ли пользователь в определённом диапазоне ИМТ. Если ИМТ меньше 18.5, мы выводим сообщение о недостаточном весе. Если ИМТ между 18.5 и 25, мы выводим сообщение о здоровом весе и т.д.:

if imt < 18.5:

print("Ваш ИМТ составляет", imt, ", что означает, что у вас недостаточный вес. Ешьте больше.")

elif imt < 25:

print("Ваш ИМТ составляет", imt, ", что означает, что ваш вес в норме. Так держать!")

elif imt < 30:

print("Ваш ИМТ составляет", imt, ", что означает, что у вас избыточный вес. Меньше ешьте на ночь.")

else:

print("Ваш ИМТ составляет", imt, ", что означает, что у вас ожирение. Рекомендуется немедленно сесть на диету.")

Полный код выглядит так:

Продолжение поста «Как я стал Python-разработчиком»

Жмите RUN. Поздравляю, вы написали программу на Python.

Для новичка этот код покажется магией, но на самом деле это одна из самых простых программ на Python. Всё это вы сможете сделать сами без подсказок и с полным осознанием всего, что вы делаете. Надеюсь кого-нибудь этот пост вдохновит на изучение крутого и простого в освоении языка программирования под названием Python :)

Показать полностью 1
74

Продолжение поста «Как я стал Python-разработчиком»6

Продолжу список полезных материалов по Python для начинающих и более опытных программистов. Все материалы бесплатные.

Показать полностью
266

Продолжение поста «Как я стал Python-разработчиком»6

Список полезных материалов для начинающих, которые мне в своё время очень помогли:

Книги:

  • Изучаем Python. Марк Лутц.

  • Изучаем Python: программирование игр, визуализация данных, веб-приложения. Мэтиз Э.

  • Python. Подробный справочник. Дэвид Бизли.

  • Программируем на Python. Майкл Доусон.

  • Программирование на Python 3. Подробное руководство. Марк Саммерфилд.

  • Совершенный код. Стив Макконнелл.

Показать полностью
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества