Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🇧🇮#Burundi : campagne de vaccination contre le HPV pour les écolières
Les autorités du Burundi ont lancé une campagne nationale de vaccination contre le papillomavirus humain (HPV) destinée aux jeunes filles de 9 à 14 ans, notamment à Bujumbura. L’objectif est de prévenir le cancer du col de l’utérus, principale cause de décès chez les femmes dans le pays, et de protéger la fertilité future.
Soutenue par l’Organisation mondiale de la santé, l’UNICEF et le GAVI (l'Alliance mondiale pour les vaccins et l'immunisation), l’initiative vise à vacciner plus de 80 % des jeunes filles avant d’intégrer ce vaccin aux pratiques courantes.
RT en français • Osez questionner !
#AESinfo | 🇧🇫#BurkinaFaso🇧🇮#Burundi
Coopération AES - UA : Evariste Ndayishimiye est arrivé à Ouagadougou.
Le Président du Faso et de la Confédération des États du Sahel, le capitaine Ibrahim Traoré, a accueilli lundi matin à l’aéroport international de Ouagadougou le président en exercice de l’Union africaine, le général Évariste Ndayishimiye, chef de l’État burundais.
À l'agenda du séjour du Président en exercice de l'organisation continentale, des échanges avec le Président de la Confédération AES et des visites d'infrastructures socio-économiques dans la capitale burkinabè.
Source : @presidencebf
#AESinfo | #BurkinaFaso🇧🇫🇧🇮#Burundi
Évariste Ndayishimiye, président en exercice de l’Union Africaine, est attendu au Burkina Faso.
Le lundi 20 avril 2026, Évariste Ndayishimiye, président de la République du Burundi et président en exercice de l’Union africaine, effectuera une visite d’amitié et de travail à Ouagadougou, chez le président en exercice de la Confédération de l’Alliance des États du Sahel (AES), le Capitaine Ibrahim Traoré.
Source : @Malijetactu
🇧🇮 Des dizaines de personnes ont péri dans l’incendie provoqué par des explosions survenues dans un dépôt de munitions à Bujumbura, la capitale économique du Burundi, a rapporté l’Agence France-Presse (AFP).
#burundi#explosion#incendie#victimes
🇧🇮 Les explosions survenues dans la capitale économique du Burundi, Bujumbura, ont été causées par un incendie dans un dépôt de munitions, a rapporté l’Agence France-Presse, citant le porte-parole de l’armée.
Un grave accident électrique dans le magasin des munitions de la FDNB [Force de défense nationale du Burundi] basé à Musaga est à l'origine des explosions entendues en ce moment dans la capitale économique Bujumbura,
a commenté le porte-parole de l'armée burundaise Gaspard Baratuza.
#burundi#explosions#accident
🇧🇮 Le président burundais Évariste Ndayishimiye a été désigné candidat à la présidence par son parti pour l’élection qui aura lieu l’année prochaine, rapporte Africanews.
Évariste Ndayishimiye, 57 ans, a pris la tête du pays en 2020 après la mort du dirigeant de longue date Pierre Nkurunziza.
#burundi#élections#candidat
L'appello di Papa #LeoneXIV al termine dell'#Angelus: "Inizia oggi la Settimana di Preghiera per l’Unità dei Cristiani. Le origini di questa iniziativa risalgono a due secoli fa, e Papa Leone XIII l’ha molto incoraggiata. Proprio cent’anni fa, per la prima volta, vennero pubblicati 'Suggerimenti per l’Ottavario di preghiera per l’unità dei cristiani'. Il tema di quest’anno è tratto dalla Lettera agli Efesini: «Un solo corpo e un solo Spirito, come una sola è la speranza a cui siete stati chiamati» (Ef 4,4). Le #preghiere e le riflessioni sono state preparate da un gruppo ecumenico coordinato dal Dipartimento per le Relazioni Interreligiose della Chiesa Apostolica Armena. Invito pertanto tutte le comunità cattoliche a rafforzare, in questi giorni, la preghiera per la piena unità visibile di tutti i cristiani. Questo nostro impegno per l’unità si deve accompagnare coerentemente con quello per la pace e per la giustizia nel mondo. Oggi desidero ricordare in particolare le grandi difficoltà che soffre la popolazione dell’est della Repubblica Democratica del #Congo, costretta a fuggire dal proprio Paese, specialmente verso il #Burundi, a causa della violenza e ad affrontare una grave crisi umanitaria. Preghiamo affinché tra le parti in conflitto prevalga sempre il dialogo per la riconciliazione e la #pace. Desidero inoltre assicurare la mia preghiera per le vittime delle inondazioni che nei giorni scorsi hanno colpito l’#Africa meridionale".