Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🇬🇧 New destination alert! TezJet is now flying directly from Bishkek to Delhi.
✈️ Starting 7th December 2025, every Sunday
www.flytezjet.com
#TezJet#BishkekToDelhi#DirectFlights#FlyTezJet#TravelWithTezJet#DelhiBound#NewRoute
🇷🇺 Новая направление! TezJet теперь летает напрямую из Бишкека в Дели.
✈️ Старт рейса: 7 декабря 2025 года, каждое воскресенье
www.flytezjet.com
#TezJet#BishkekToDelhi#DirectFlights#FlyTezJet#TravelWithTezJet#DelhiBound#NewRoute
✈️ BIG NEWS! TezJet is taking off to Moscow, Russia 🇷🇺
📍 Direct flights from Bishkek (FRU) to Moscow Domodedovo (DME)
📅 Launching 21 August 2025
🕕 Departure from Bishkek: 06:20 AM
🕖 Arrival in Moscow: 07:50 AM
📅 Operating 3 times a week:
➡️ Monday
➡️ Thursday
➡️ Saturday
🚀 Experience the comfort of our MD-83 aircraft as you fly direct to the heart of Russia. Whether it’s business, family, or adventure—Moscow is calling!
🎟️ Tickets are now on sale at www.flytezjet.com
Don't miss the first flight—book your seat now!
#TezJetAirlines
#TezJetToMoscow#MoscowFlights#TezJetAirlines#FlyTezJet#BishkekToMoscow#NewRoute#TravelWithTezJet
✈️ BIG NEWS! TezJet is taking off to Moscow, Russia 🇷🇺
📍 Direct flights from Bishkek (FRU) to Moscow Domodedovo (DME)
📅 Launching 21 August 2025
🕕 Departure from Bishkek: 06:20 AM
🕖 Arrival in Moscow: 07:50 AM
📅 Operating 3 times a week:
➡️ Monday
➡️ Thursday
➡️ Saturday
🚀 Experience the comfort of our MD-83 aircraft as you fly direct to the heart of Russia. Whether it’s business, family, or adventure—Moscow is calling!
🎟️ Tickets are now on sale at www.flytezjet.com
Don't miss the first flight—book your seat now!
#TezJetToMoscow#MoscowFlights#TezJetAirlines#FlyTezJet#BishkekToMoscow#NewRoute#TravelWithTezJet
🍞Гастромаршрут «Хлеб да соль земли Новогрудской» – это не только хлеб, но и зрелища!
Пройти по старинному городу, заглянуть в антикварную лавку на подступах к замку, выпить авторский кофе в костёле Святого Архангела Михаила, узнать историю любимого белорусского поэта Адама Мицкевича на театрализованной экскурсии, подняться на 35-метровую высоту старейшего костела Беларуси — костела Св.Казимира, спуститься с возвышенной душой и испечь ржаной хлеб на закваске в Казимировском Доме и конечно отдохнуть с французским шиком в экоусадьбе «Лавандовый сад» под пение птиц, хруст багета и со вкусом крафтовых сыров.
Узнать больше о маршруте и стать обладателем уникального чемоданчика 👉@visitNavahrudak
г. Новогрудок, пл. Ленина, 7, ТИЦ г. Новогрудка.
📱🎞Vkontakte
📱🎞Instagram
#познайбеларусь#новогрудок#маршруты#belarustravel#newroute#food#belarus
При использовании фото и материалов просьба отмечать @natbelarus (нам тоже нравится, что вам нравится) 😊🌿🙌
#познайбеларусь#гастротуризм#новогрудок
If you are going to visit Doha, you can use this selection of attractions that are worth visiting:
◽Museum of Illusions
◽Gondolania Theme Park & Villaggio Mall
◽The Pearl Island
◽Souq Waqif
◽Simaisma Beach
✈️ P.S. We will operate flights to Doha once a week: on Thursdays.
☎️ Tel.: 44-640-40-49, 44-640-40-50, 1133.
🌊
Если Вы собрались в Доху, Вам не помешает эта подборка достопримечательностей, которые стоит посетить:
◽Музей Иллюзий
◽Тематический парк Gondolania и Торговый центр Villaggio
◽Набережная The Pearl Island
◽Рынок Souq Waqif
◽Пляж Simaisma Beach
✈️ P.S. Мы будем совершать полёты в Доху раз в неделю: по четвергам.
☎️ Тел.: 44-640-40-49, 44-640-40-50, 1133.
#somonair#doha#qatar#newroute#сомонэйр#доха#катар#новыйрейс