Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Dans l’est de la #RDC, la faim progresse loin des regards
Autour de Goma, des milliers de familles font face à une insécurité alimentaire grandissante, tandis que la malnutrition menace des vies chaque jour. Sur le terrain, le Programme alimentaire mondial tente d’apporter une aide vitale, mais le manque de financements impose des choix difficiles et réduit la portée de l’assistance.
🗣Les précisions avec Malaika Élysée.
RT en français • Osez questionner !
🎤Dans l’est de la #RDC, les engagements pris à Montreux, en Suisse, peinent toujours à se traduire en actes. Entre le gouvernement congolais et le groupe armé AFC/M23, le processus de libération des détenus reste bloqué. Les précisions avec Malaika Élysée.
RT en français • Osez questionner !
🎤En #RDC, la création annoncée d’une garde minière par l’Inspection générale des mines, pour sécuriser les sites et le transport des minerais stratégiques, relance le débat. Entre nécessité de répondre à l’insécurité persistante et contestations sur sa légitimité, ce projet d’un coût de 100 millions de dollars divise, d’autant plus que les États-Unis refusent d’en assurer le financement.
RT en français • Osez questionner !
📎Opération humanitaire en cours
Dans l’est de la #RDC, le rapatriement volontaire des réfugiés congolais en provenance du Burundi est désormais en cours. Encadrée par le Haut-Commissariat des Nations unies pour les réfugiés, cette opération intervient dans un contexte d’accalmie relative dans certaines zones du Sud-Kivu.
Les précisions avec Malaika Élysée.
RT en français • Osez questionner !
Le conflit dans l’est de la #RDC continue de fragiliser l’économie nationale. Dans son dernier rapport, le FMI alerte sur l’impact des affrontements entre l’armée congolaise et l’AFC/M23 sur les finances publiques du pays.
🗣Les précisions de Malaika Élysée.
RT en français • Osez questionner !
🎤Dans l’est de la #RDC, une nouvelle attaque meurtrière attribuée aux rebelles ADF a fait au moins 26 morts dans le territoire de Beni, au Nord-Kivu. Ce nouveau drame relance les interrogations sur l’efficacité de l’état de siège instauré depuis 2021 pour ramener la sécurité dans la région. Les précisions de Malaika Élysée.
RT en français • Osez questionner !
Dans l’est de la #RDC, la faim progresse loin des regards
Autour de Goma, des milliers de familles font face à une insécurité alimentaire grandissante, tandis que la malnutrition menace des vies chaque jour. Sur le terrain, le Programme alimentaire mondial tente d’apporter une aide vitale, mais le manque de financements impose des choix difficiles et réduit la portée de l’assistance.
🗣Les précisions avec Malaika Élysée.
RT en français • Osez questionner !
🎤Dans l’est de la #RDC, les engagements pris à Montreux, en Suisse, peinent toujours à se traduire en actes. Entre le gouvernement congolais et le groupe armé AFC/M23, le processus de libération des détenus reste bloqué. Les précisions avec Malaika Élysée.
RT en français • Osez questionner !
🎤En #RDC, la création annoncée d’une garde minière par l’Inspection générale des mines, pour sécuriser les sites et le transport des minerais stratégiques, relance le débat. Entre nécessité de répondre à l’insécurité persistante et contestations sur sa légitimité, ce projet d’un coût de 100 millions de dollars divise, d’autant plus que les États-Unis refusent d’en assurer le financement.
RT en français • Osez questionner !
Le président rwandais déclare ne pas savoir si les troupes de son pays sont présentes au Congo 🇨🇩#RDC🤮
Tiens, quand il s’agit de la Russie, la presse occidentale collaborationniste reçoit des ordres pour diaboliser Poutine, pour ne pas lui accorder la parole et l'isoler. Mais quand c’est leur agent Paul Kagame, ça déroule le tapis rouge et on lance la machine à blanchir pour le présenter et le vendre comme un homme bien, innocent, pendant que les cadavres s'accumulent au Congo 🇨🇩.
@egountchibehanzinTV
#AESinfo | #RDC🇨🇩
🔴 Alerte sanitaire en RDC : 143 morts d'une maladie inconnue dans le Sud-Ouest
Une épidémie mystérieuse sévit dans la province du Sud-Ouest de la République démocratique du Congo. Depuis le mois de novembre, au moins 143 personnes sont décédées, principalement dans la zone de santé de Panzi. Les autorités sanitaires sont débordées face à cette maladie qui se caractérise par de la fièvre et de violents maux de tête. L'Organisation mondiale de la santé a été alertée et mène actuellement des investigations.
Image d'illustration
#AESinfo | #RDC🇨🇩🤝🏾🇲🇱#Mali
Tensions avec le M23 : Assimi GOÏTA reçoit le Ministre de la Justice Congolais, Mystère sur le Message de Tshisekedi
Le Président de la Transition, le Général d’Armée Assimi GOÏTA, Chef de l’État, a reçu en audience, ce vendredi 21 février 2025, un porteur de message de Son Excellence Félix Antoine TSHISEKEDI TSHILOMBO, Président de la République Démocratique du Congo (RDC).
M. Constant MUTAMBA TUNGUNGA, Ministre d’État, ministre de la Justice et Garde des Sceaux de la RDC, était accompagné de Son Excellence Christophe MUZUNGA, Ambassadeur de la RDC au Mali, résidant à Dakar, ainsi que de M. TALUBULU TSHIS OSIBOWA Godfrey, Conseiller.
Retrouvez l’article complet sur
Twitter X @AESinfos
Facebook https://www.facebook.com/share/15uWZrHWNe/?mibextid=wwXIfr