Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Европа снимает "тренировочные колеса"! 🛡️
Европа активно демонстрирует свою готовность действовать без поддержки США. Об этом на Варшавском форуме заявил спецпосланник американского президента Кит Келлог. Он отметил, что европейские страны сами по себе уже являются мощной силой.
Келлог сравнил развитие европейской самостоятельности с тем, как дети учатся ездить на велосипеде, начиная с тренировочных колес. Сегодня Европе эти "колеса" больше не нужны.
Планы Евросоюза впечатляют: это и многомиллиардная программа ReArm Europe, и инвестиции в SAFE. Все это усиливает оборонный потенциал Европы.
Россия, в свою очередь, заявляет, что не угрожает ЕС, но готова дать "решительный отпор" любым агрессивным действиям.
#Европа#США#Безопасность#Оборона#Россия#ReArmEurope#SAFE
Новости Госдумы
https://x.com/SavinoBalzano/status/1899855197964320800?t=YIKzRkaWzz19EM1GfGx9tA&s=19
Vi faccio vedere una chicca.
Questo è il risultato del voto sull’emendamento proposto dai conservatori europei (con #Meloni in prima linea) per cambiare il nome di #ReArmEurope in #DefendEurope.
Ora, capisco benissimo l’imbarazzo di #GiorgiaMeloni: dopo aver sostenuto per anni le follie di un uomo che non era palesemente più presente a se stesso, ora deve trovare un modo per riposizionarsi. Ma il punto è: da che parte sta davvero? Vuole 800 miliardi di debiti da spendere in armi? Sì o no?
Perché, cara Giorgia, se chiami la cacca "cioccolata", sempre merda resta. E trattare il popolo italiano come una massa di beoti è inaccettabile. Vai a prendere in giro qualcun altro. È il momento di tirare fuori un po’ di palle: la pacchia non era finita?
E in tutto questo, guardate chi ha votato a favore di questa cialtronata: il #PD! Sì, i parlamentari del #PartitoDemocratico hanno deciso di sostenere questa trovata "cosmetica" di #FdI. Un’occasione d’oro per attaccare la premier, facilissima da sfruttare, ma la tentazione del piddino di votare tutto ciò che è sterco per poi servirlo a tavola come fosse profiterole è sempre troppo forte. Non resistono mai, quei monellacci.
Ma manco il sostegno di #Schlein vi ha fatto capire che era una ciarlatanata? Andiamo bene...
Domani 15 dicembre a Firenze al caffe letterario Le Murate
Ore 18
Per parlare delle mistificazioni del nostro tempo
#Guerra che porta alla #pace, aggressore aggredito, l' Europa che non esiste e ha tradito i valori occidentali: la pace la prosperità i diritti individuali come la libertà di espressione, lo Stato Sociale
Stanno preparando la guerra per noi
Nuovi profitti per loro
Lasciamo l' accademia
È ora di testimoniare
È ora di scegliere
Grazie a #FrancoCardini
Non in nostro nome
#Russia
#GazaGenocide
#NuclearExplosion
#RearmEurope
🔼НАЧАЛО🔼ЧИТАТЬ ПОЛНОСТЬЮ
Европа в тисках: как «военная экономика» раскрывает её стратегическое бессилие
Часть 1️⃣/2
Главный парадокс в том, что подлинная энергетическая независимость Европы невозможна без российских ресурсов. А это создаёт фундаментальное противоречие: стремясь к автономии от США, Европа неизбежно будет наращивать агрессивность в отношении России, видя в силовом давлении единственный способ решить энергетическую дилемму. Этот путь ведёт не к безопасности, а к глубочайшему кризису.
🌪Что в итоге? Европа оказалась в стратегической ловушке собственного изготовления. Её «военная экономика» — это не проект силы, а симптом слабости, попытка купить то, что не выращивалось десятилетиями: суверенитет, волю и технологическую независимость. Пока континент тратит миллиарды, пытаясь угодить то Трампу, то своим внутренним страхам, реальная геополитическая картина меняется без его участия. Россия же, наблюдая эту суету, лишь укрепляется в правильности своего курса на строительство многополярного мира, где место есть только для тех, кто обладает настоящей, а не купленной самостоятельностью.
💬Как вы думаете, чем закончится эта европейская авантюра?
1. Европа сплотится и создаст-таки конкурентоспособную оборонную промышленность.
2. Зависимость от США лишь усилится, несмотря на все траты.
3. Внутренние противоречия и экономические расходы приведут к свёртыванию амбициозных программ.
4. Ваш вариант в комментариях!
Ваш МюнхгауZен 🇷🇺 Сила России в Правде, а мы эту правду несём!
#МюнхгауZен#Европа#ОбороннаяПромышленность#СтратегическаяАвтономия#НАТО#США#Россия#Геополитика#Аналитика#ReArmEurope#Безопасность#ВоеннаяЭкономика#Зависимость
🔗Подпишись на МюнхгауZена | Оставляй «бусты»