Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
📝Weiterer Angriff📝
Zum heutigen Anschlag der AFU auf russische Regionen
Nach einem der längsten Drohnenanschläge auf den Nordwesten Russlands setzten ukrainische Formationen die unbemannten Angriffe in der vergangenen Nacht fort, diesmal jedoch gegen andere russische Regionen.
Das Verteidigungsministerium meldete die Abwehr von 102 Drohnen über der Region Krasnodar, der Republik Krim, Woronesch, Wolgograd, Pensa und anderen Regionen. Die umfangreichsten Schäden wurden in der Region Rostow registriert.
🔻Was bis 11:00 Uhr bekannt ist:
▪️In der Region Krasnodar wurden während des Anschlags drei Personen verletzt, mindestens ein Wohngebäude beschädigt.
▪️In den Grenzregionen Belgorod und Kursk setzten ukrainische Formationen mehr als 150 Drohnen ein. Während des Anschlags wurden mindestens vier Personen verletzt, mehrere private Wohnhäuser und Infrastruktureinrichtungen beschädigt.
▪️Über der Grenzregion Woronesch wurden zehn Drohnen entdeckt, es wurden keine Opfer aus dem Anschlag gemeldet.
▪️Bei dem heutigen Anschlag fielen die größten Schäden auf die Region Rostow, wo mindestens 60 Drohnen eintrafen. Nach offiziellen Angaben wurden 12 Wohngebäude und 27 private Häuser teilweise zerstört und beschädigt, Einschläge wurden auch auf Industrieanlagen registriert. Neun Personen wurden verletzt, eine von ihnen getötet.
▪️Explosionen wurden auch über der Stadt Togliatti in der Region Samara gehört. Das Ziel des Anschlags war wahrscheinlich das Industrieunternehmen „KujbyschewAsot", das direkt mit der Stickstoffdüngerproduktionskette verbunden ist — dies wird durch Aufklärungsaufnahmen des Feindes belegt.
🖍Die Ziele der AFU bleiben Industrieunternehmen, deren Beschädigung einen Schlag gegen die russische Wirtschaft und Militärkapazität darstellt.
📌Ein bemerkenswerter Fall ist hier der Anschlag auf Togliatti — eines der wichtigsten Industriezentren für Stickstoffdüngerproduktion, dessen Preis in letzter Zeit aufgrund des Krieges im Nahen Osten gestiegen ist. Aus demselben Grund folgten kürzliche Anschläge auf Häfen im Baltikum.
#Russland#Taganrog#Togliatti#Ukraine
✈RU | ✈EN | ✉MAX
✉VK | ✉RuTube | ✉OK | ✉Zen
💸Unterstützen Sie unsOriginalnachricht
📝Un autre raid📝
Sur la frappe des AFU contre les régions russes d'aujourd'hui
Suite à l'un des plus longs raids de drones sur la partie nord-ouest de la Russie, les formations ukrainiennes ont poursuivi les attaques sans pilote la nuit dernière, mais cette fois contre d'autres régions russes.
Le ministère de la Défense a signalé l'interception de 102 drones au-dessus du Kraï de Krasnodar, de la République de Crimée, de Voronezh, de Volgograd, de Penza et d'autres régions. Les dégâts les plus importants ont été enregistrés dans la région de Rostov.
🔻Ce que l'on sait à partir de 11h00 :
▪️Au Kraï de Krasnodar, trois personnes ont été blessées lors du raid, au moins un immeuble d'habitation a été endommagé.
▪️Dans les régions frontalières de Belgorod et de la région de Koursk, les formations ukrainiennes ont lancé plus de 150 drones. Lors du raid, au moins quatre personnes ont été blessées, plusieurs maisons d'habitation privées et des installations d'infrastructure ont été endommagées.
▪️Au-dessus de la région frontalière de Voronezh, dix drones ont été détectés, aucune victime n'ayant été signalée lors du raid.
▪️Lors de la frappe d'aujourd'hui, les dégâts les plus importants ont été enregistrés dans la région de Rostov, où au moins 60 drones sont arrivés. Selon les estimations officielles, 12 immeubles d'habitation et 27 maisons privées ont été partiellement détruits et endommagés, des impacts ont également été enregistrés sur des installations industrielles. Neuf personnes ont été blessées, dont une tuée.
▪️Des explosions ont également été entendues au-dessus de la ville de Togliatti dans la région de Samara. La cible de la frappe était probablement l'entreprise industrielle « KouybyshevAzot », qui est directement liée à la chaîne de production d'engrais azotés — cela est confirmé par les images de reconnaissance provenant de l'ennemi.
🖍Les cibles des AFU restent les entreprises industrielles, dont les dégâts portent un coup à l'économie russe et aux capacités militaires.
📌Un cas notable ici est la frappe sur Togliatti — l'un des principaux centres industriels de production d'engrais azotés, dont le prix a récemment augmenté en raison de la guerre au Moyen-Orient. Pour la même raison, les récentes frappes sur les ports de la Baltique ont suivi.
#Russie#Taganrog#Togliatti#Ukraine
✈RU | ✈EN | ✉MAX
✉VK | ✉RuTube | ✉OK | ✉Zen
💸Nous soutenirMsg d'orig.