Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Loď podpory IRIS Shahid Mahdavi námorníctva KSI po sérii amerických útokov.
#Irán
@new_militarycolumnist
🌐Zdroj:@new_militarycolumnist
🔗Link:https://t.me/new_militarycolumnist/174454
https://t.me/casusbellilive
Truth over narrative 24/7
WEB | CONTACT | SHOP
📅Vytvorené: 2026-04-10 15:35:40
❗️Izraelský premiér Benjamin Netanjahu vyhlásil, že v prípade, ak Irán odmietne odovzdať svoj obohatený urán tretej strane, bojové operácie sa obnovia s novou silou.
#Irán
@new_militarycolumnist
🌐Zdroj:@new_militarycolumnist
🔗Link:https://t.me/new_militarycolumnist/174347
https://t.me/casusbellilive
Truth over narrative 24/7
WEB | CONTACT | SHOP
📅Vytvorené: 2026-04-08 20:22:52
Zábery nočných útokov na letisko Mehrabad v Teheráne.
#Irán
@new_militarycolumnist
🌐Zdroj:@new_militarycolumnist
🔗Link:https://t.me/new_militarycolumnist/174237
https://t.me/casusbellilive
Truth over narrative 24/7
WEB | CONTACT | SHOP
📅Vytvorené: 2026-04-07 06:53:39
Vzdušné sily Izraela zasiahli sériu silných úderov na leteckú základňu v iránskom Bušere.
#Irán
@new_militarycolumnist
🌐Zdroj:@new_militarycolumnist
🔗Link:https://t.me/new_militarycolumnist/174216
https://t.me/casusbellilive
Truth over narrative 24/7
WEB | CONTACT | SHOP
📅Vytvorené: 2026-04-06 15:35:26
⚡️V Iráne oznámili, že operácia na záchranu druhého člena posádky zostreleného amerického stíhača zlyhala a samotný pilot bol zajatý/zabitý IRGC.
#Irán
@new_militarycolumnist
🌐Zdroj:@new_militarycolumnist
🔗Link:https://t.me/new_militarycolumnist/174174
https://t.me/casusbellilive
Truth over narrative 24/7
WEB | CONTACT | SHOP
📅Vytvorené: 2026-04-05 13:06:50
Sion armada IDF oznámila masívny úder na špeciálnu ekonomickú zónu petrochemického komplexu Mahšar na juhu Iránu.
#Irán
@new_militarycolumnist
🌐Zdroj:@new_militarycolumnist
🔗Link:https://t.me/new_militarycolumnist/174144
https://t.me/casusbellilive
Truth over narrative 24/7
WEB | CONTACT | SHOP
📅Vytvorené: 2026-04-04 20:00:49
Jeden z hraničných prechodov medzi Iránom a Irakom sa stal cieľom izraelského útoku.
#Irán
@new_militarycolumnist
🌐Zdroj:@new_militarycolumnist
🔗Link:https://t.me/new_militarycolumnist/174127
https://t.me/casusbellilive
Truth over narrative 24/7
WEB | CONTACT | SHOP
📅Vytvorené: 2026-04-04 12:48:21
⚡️Jedna z pomocných budov jadrovej elektrárne "Bušer" v Iráne bola poškodená v dôsledku izraelského útoku. Jeden človek zahynul. Je to najbližší zásah k samotnej elektrárni od začiatku vojny.
V jadrovej elektrárni stále zostávajú ruskí špecialisti.
#Irán
@new_militarycolumnist
🌐Zdroj:@new_militarycolumnist
🔗Link:https://t.me/new_militarycolumnist/174122
https://t.me/casusbellilive
Truth over narrative 24/7
WEB | CONTACT | SHOP
📅Vytvorené: 2026-04-04 10:46:02
🇲🇱🇷🇺Mercenarios, ucranianos y terroristas: ¿Qué está ocurriendo en Malí?
Un ataque con una fuerza de hasta 12.000 terroristas intentó tomar por sorpresa a las FFAA de Malí y al Cuerpo Africano de Rusia.
¿Quién coordina las acciones de los atacantes? París perdió mucho tras la llegada de gobiernos soberanistas a Malí, Níger y Burkina Faso.
❗️VIDEO COMPLETO EN X
❗️ VIDEO COMPLETO EN ODYSEE
#irán
———
Únete a la lucha por la verdad en
📱Telegram
🫥Odysee
📱X
Atentado terrorista en #Irán en la tumba del líder de la Guardia Revolucionaria
https://elpais.com/internacional/2024-01-03/varios-muertos-en-dos-explosiones-en-iran-cerca-de-la-tumba-del-comandante-de-la-guardia-revolucionaria.html