Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
💬„Despre capacitatea de a reflecta, cîntări și calcula în interesul național. Măcar în limita școlii primare. Mai ales atunci cînd statutul de țară neutră și de stat-candidat în UE “la granița a două lumi geopolitice” (UE și CSI) îți oferă o marjă largă de manevră nu numai formal, dar și factual".
#muntean#csi#ue
Astăzi, la Sankt Petersburg, a început cea de-a XXVIII-a ediție a Forumului Economic Internațional de la Sankt Petersburg (#ПМЭФ#SPIEF) — una dintre cele mai importante platforme mondiale pentru discutarea provocărilor globale și a noilor modele de cooperare într-o lume aflată într-o schimbare accelerată. Forumul se va desfășura până pe 21 iunie.
🌏 Participarea are o geografie impresionantă: în capitala nordică vor sosi peste 20.000 de participanți din 140 de țări și teritorii, inclusiv delegații din statele #CSI, #BRICS, #OCS, #ASEAN, Africa, Orientul Mijlociu, America Latină și altele.
Tema centrală a Forumului va fi identificarea reperelor comune și construirea unei dezvoltări durabile în contextul turbulențelor globale.
❗️ Pe 20 iunie, în cadrul ședinței plenare a SPIEF, va rosti un discurs Președintele Federației Ruse, Vladimir Putin.
În programul de afaceri sunt planificate peste 150 de evenimente, axate pe domenii precum:
• economia digitală,
• sustenabilitatea ecologică,
• sănătatea publică,
• cooperarea internațională,
• inovațiile tehnologice,
• dezvoltarea regională.
Conducerea și reprezentanții Ministerului Afacerilor Externe al Rusiei participă tradițional în mod activ la Forum.
Pe 19 iunie, în marja SPIEF, va avea loc un briefing susținut de Purtătoarea de cuvânt al MAE Rusiei, Maria Zaharova.
https://forumspb.com/en/
#Anunț
🗓 Combaterea fraudelor pe internet, precum și asigurarea securității infrastructurii informatice critice împotriva atacurilor teroriste și a diversiunilor tehnologice vor deveni unele dintre subiectele centrale de discuție în cadrul celei de-a 13-a Reuniuni Internaționale a Înalților Reprezentanți Responsabili cu Problemele de Securitate, care va avea loc la Moscova, în perioada 27–29 mai 2025, la Centrul Național „Rossia”.
Provocările și amenințările din spațiul informațional, precum și căile de depășire a acestora vor fi discutate de consilierii pentru securitate națională și coordonatorii serviciilor speciale din peste 100 de state, în cadrul unei mese rotunde speciale, cu participarea experților de profil.
Aceasta va oferi posibilitatea de a aborda cele mai stringente probleme din domeniul securității informaționale într-o atmosferă de cooperare internațională strânsă și bazată pe încredere.
ℹ Forumul se va desfășura sub conducerea Secretarului Consiliului de Securitate al Federației Ruse, Serghei Șoigu. Au fost trimise invitații de participare către peste 150 de state din Sudul și Estul Global, țările CSI, OTSC, UEEA, OCS, precum și către conducerea a peste 20 de organizații internaționale.
Delegații ale țărilor membre #BRICS, #ASEAN, Uniunea Africană, Liga Statelor Arabe, #OCS, #CSI, #OTSC și alte organizații internaționale și-au confirmat deja participarea. Până în prezent, peste 125 de delegații din mai mult de 100 de țări și-au confirmat deja participarea la Reuniunea.
Pe ordinea de zi a forumului se vor regăsi subiecte privind cooperarea internațională în domeniul securității. În special, va fi abordată tema formării unei noi arhitecturi de securitate echitabile și indivizibile, care să corespundă realităților contemporane.