Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для URL, имени файла, имени объекта в каком-то софте и тд. Требования совместимости простые: в тексте должны быть только допустимые символы. Обычно это a-z, 0-9 и "_" или "-". То есть, только прописные буквы латинского алфавита и цифры (как пример).
Допустим, нам нужно название статьи в блоге преобразовать в slug для добавления его в URL этой статьи. Как это лучше всего сделать?
В Django по умолчанию есть готовая функция slugify для таких случаев.
Но я её никогда не использую. Почему? Потому что её недостаточно!
Приведём пример
>>> from django.utils.text import slugify
>>> slugify('This is a Title')
'this-is-a-title'
Пока всё отлично
>>> slugify('This is a "Title!"')
'this-is-a-title'
Спец символы удалились, всё хорошо.
>>> slugify('Это заголовок статьи')
''
Вот и приехали 😢. Если текст не английский то буквы просто игнорируются. Можно это поправить
>>> slugify('Это заголовок статьи', allow_unicode=True)
'это-заголовок-статьи'
Но тогда мы не вписываемся в условие. У нас появилась кириллица в тексте.
Так как я часто пишу сайты для русскоязычных пользователей эта проблема весьма актуальна. Я не использую стандартную функцию и всегда пишу свою.
Оригинал я не беру в расчёт и пишу полностью свою функцию. И так, по порядку:
🔸1. Исходный текст:
>>> text = 'Мой заголовок №10 😁!'
Взял специально посложней со специальными символами.
🔸2. Транслит
Необходимо сделать транслит всех символов в латиницу. Здесь очень выручает библиотека unidecode. Помимо простого транслита кириллицы в латиницу она умеет преобразовывать спец символы и иероглифы в текстовые аналоги.
from unidecode import unidecode
>>> unidecode("Ñ Σ ® µ ¶ ¼ 月 山")
'N S (r) u P 1/4 Yue Shan'
Очень крутая библиотека, советую👍
В нашем случае получаем такое преобразование:
>>> text = unidecode(text)
>>> print(text)
'Moi zagolovok No. 10 !'
Отличный транслит. Смайл просто удалился, хотя я ждал что-то вроде :). Ну и ладно, всë равно невалидные символы.
А еще наш код уже поддерживает любой язык, будь то хинди или корейский.
🔸4. Фильтр символов
Unidecode не занимается фильтрацией по недопустимым символам. Это мы делаем в следующем шаге через regex. Просто заменим все символы на "_" если они вне указанного диапазона.
>>> text = re.sub(r'[^a-zA-Z0-9]+', '_', text)
>>> print(text)
'Moi_zagolovok_No_10_'
Символ "+" в паттерне выручает когда несколько недопустимых символов идут рядом. Все они заменяются на один символ "_".
🔸5. Slugify
Осталось удалить лишние символы по краям и сделать нижний регистр
>>> text = text.strip('_').lower()
>>> print(text)
'moi_zagolovok_no_10'
Получаем отличный slug! 😎
🌎 Полный код в виде функции.
______________
PS. Проверку что в строке остался хоть один допустимый символ я бы вынес в отдельную функцию.
#libs#tricks#django
Я упал с 30 метровой скалы. Колено и голеностоп вывернуло. Резкая боль пронзила ногу.
Это случилось на днях. Мы поехали с друзьями подснять сочного контента. Я был уставший, потому что только закончил программу ПОДГОТОВКА К СОРЕВНОВАНИЯМ FWQ.
Но, лучше бы мне остаться дома.
Уже на разминочном спуске почувствовал сильную усталость. Стоило бы развернуться и плюнуть на все. Ведь именно это я говорю своим студентам и мои инструкторы учат в школе ПРО ЛЫЖИ: Всегда уходи голодным со склона!
Но я проигнорировал это правило и огреб по полной.
Перед проездом я внимательно изучил склон с разных сторон, выбрал линию, отметил точку приземления. Все выглядело белым и пушистым. Без проблем – снимаем. И, конечно, был правильный свет, который нужно было не пропустить - шли тучи. Я спешил.
Точка старта. Проезд до дропа. Прыжок… И в момент приземления одна нога попала в яму под камнем, который был еле присыпан, и не читался на склоне. Лыжа ушла в сторону. Удержаться было не реально. Я потерял равновесие и покатился кубарем с 30 метровой скалы.
Колено вывернуло, но насколько все серьезно я осознал только потом.
Дальше началось самое страшное. Меня накрыло лавиной. Снег который я сорвал своим падением, ссыпался в узкую ложбину, на дне которой я лежал.
И ЕДИНСТВЕННОЕ, что меня спасло в этот день это инстинкт и реакция, в момент остановки я рванул вверх и в этот момент меня накрыло снегом. Если бы остался лежать, как это часто бывает с райдерами после падения, то меня бы засыпало. Я не катался один, но человек, который мог оказать мне помощь, уже был ниже меня по склону и не успел бы ко мне..
Никогда не сдавайтесь. Не расслабляйтесь после падения в местах, где есть даже малая вероятность схода слаффа. Вставайте сразу.
И помните, такое может случаться с каждым. Каким бы профессионалом вы не были. Ну и, конечно же, оставайтесь дома, если чувствуете, что сегодня нет сил на каталку. @invokedrinks#invoke
Регистрация на Invoke x PumpJam 2025 открыта 🔥
Переходите и оставляйте свои заявки, чтобы принять участие в самом жарком событии этой весны 👇
http://invokepumpjam.ru
#invokedrinks#invoke
INVOKE НА САМОЙ ВЫСОКОЙ ТОЧКЕ РОССИИ И ЕВРОПЫ 🏔️
…или как мы покоряем самые опасные горы!
Недавно Григорий Корнеев вместе с участниками программы «Эльбрус. Восхождение» взошел на вершину самой высокой горы России. Красивые кадры прилагаются.
Смелость и отвага, храбрость и решительность – это все про нас. Про тех, кто не боится взглянуть страхам в глаза и бороться до конца. Гордимся! ❄️
#invokedrinks#invoke
8 июня в Юкках прошел первый этап чемпионата по ХСО Северо-Запада 🌳
Трасса гонки неоднократно принимала самые статусные соревнования, в том числе международные. Продолжительность гонки составила 1,5 часа. Поздравляем победителей и призеров соревнований, показавших настоящее кросс-кантри мастерство.
Видно сразу, заряжены INVOKE💚
#invokedrinks#invoke
Заряжаем детей MM RACING School лимонадами, а тренеров – энергетическими напитками INVOKE ❤️
Детский лагерь и тренировочные сборы проходят гораздо продуктивнее и веселее, когда под рукой есть вкусный запас энергии 🍒
#invokedrinks#invoke
I этап кубка Новгородской области по триатлону 💛
1 июня в Новгородском районе состоялись соревнования на велосипедно–шоссейной трассе.
Уже 2 год подряд мы заряжаем энергией спортсменов перед и после прохождения дистанций. Всего участники преодолели 2546.5 км, финишировали 167 человек.
Очень энергичное начало этого лета вместе с invoke 🔥
#invokedrinks#invoke
В Австрии завершилась самая известная в мире экстремальная гонка эндуро ⚡️
Вот и итоги по гонке:
⏺36 км трек;
⏺27 кп;
⏺таймбар – 4 часа;
⏺500 участников из 1000 на прологе.
Спортсмен invoke Данила Черняев занял 30 место на легендарной гонке Red Bull Erzbergrodeo, доехав до 21 кп. Поздравляем 🔥
#invokedrinks#invoke
ВСЕМИРНЫЙ день БЕГА 👣
Международный день бега ежегодно отмечаемый в первую среду июня, то есть сегодня!
Поэтому хотим поздравить всех причастных с праздником и напомнить, что на эту тему у нас есть интереснейший подкаст с Максимом Егоровым, которой пробежал 10 000 км от Санкт-Петербурга до Владивостока 👀
📱смотреть на YouTube
#invokedrinks#invoke
Гравийная гонка с INVOKE 🏁
31 мая ребята из @la_ruta провели
домашнюю гравийную гонку в сумерки. 43 км с набором высоты 280м. 30% асфальт, 70% лес с довольно сложными горками, корнями и песком.
Вышла непростая, но очень атмосферная гонка в кругу друзей. А главное, что несмотря на позднее время гонки все были полны энергии 💚
#invokedrinks#invoke
Вчера Илья Кузьминов провел турнир по самокату в городе Урай, Ханты-Мансийский автономный округ ⚡️
Турнир на Кубок главы города собрал несколько десятков самокатчиков. Они приняли участие в соревнованиях и мастер-классе от Ильи.
Ребята прокачали свои навыки и научились делать новые трюки под присмотром действующего чемпиона России 🔥
#invokedrinks#invoke
ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ ЗАХВАТЫВАЕТ МИР? 🤖
Сегодня в гостях нашей студии Григорий Фокин – специалист, который работает в компании по разработке нейросетей. В новом подкасте мы обсудили самые интересные и актуальные вопросы, связанные с искусственным интеллектом.
Как работает ИИ? Как правильно вводить запросы и на какие нейросеть никогда не ответит? Откуда она все знает? Топ 10 нейросетей, чем они отличаются от человека, а также самые распространенные мифы про ИИ уже в новом подкасте от Invoke 🔥
#invokedrinks#invoke