Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
📢 Putin sends best wishes to Chechen fighters in special military operation. Supports their families too. War heroes fighting courageously at the front lines. 🤝 Meeting with Kadyrov fuels speculation. 🎥 Video captures Putin-Kadyrov encounter. Stay tuned for details. 🤫 Kremlin silent on Kadyrov's son's violent video. 💥 Controversy surrounds Chechnya's leader. Opposition claims Kadyrov in a coma. First post from Kadyrov's son after Quran incident. #Russia#Chechnya#WarHeroes
https://www.gazeta.ru/army/news/2023/09/28/21383773.shtml
Subscribe to @BadVolfNews
State of Emergency Declared in Chechnya Due to Heavy Rainfall
Chechen leader Ramzan Kadyrov has declared a state of emergency following severe rains causing flooding and disrupting daily life. Authorities are mobilizing resources to stabilize the situation and assist affected residents. This measure aims to speed up emergency response and provide necessary support during the crisis. The situation remains closely monitored.
#Chechnya#Emergency#Weather#RamzanKadyrov#Russia
The main news of Russia and the world ishere.
State of Emergency Declared in Dagestan and Chechnya Due to Floods
A federal-level State of Emergency has been declared in Dagestan and Chechnya following severe flooding. Local authorities and emergency services are working to address the disaster’s aftermath and assist those affected. The measure aims to coordinate efforts and mobilize resources for regional recovery.
“The main priority is ensuring public safety and minimizing damage,” the Emergency Ministry stated.
#Russia#Emergency#Dagestan#Chechnya#Flood
The main news of Russia and the world ishere.
Heavy Rain Disrupts Power Supply in Ingushetia and Chechnya
Severe downpours have caused power and water outages in Ingushetia cities—Karabulak, Nazran, and Sunzha. Specialists are working to fix faults in electrical grids and pumping stations. Similar disruptions affect some Chechen districts due to rain and wind.
“Several areas in Karabulak are experiencing electricity interruptions caused by heavy rainfall,” local authorities reported.
#Ingushetia#Chechnya#Weather#PowerOutage#Emergencies
The main news of Russia and the world ishere.
Ассаламу Алайкум, дорогие друзья!
Республиканское общественное движение «Турпалхой» искренне поздравляет Главу ЧР, Героя России Рамзана Ахматовича Кадырова с присвоением ему звания «Герой Чеченской Республики»!
Рамзан Ахматович подтверждает свой героизм на протяжении многих лет у руководства региона. Благодаря его стратегически точным и важным решениям чеченский народ обрел мир и порядок на своей земле. Рамзан Ахматович сумел уничтожить до последнего представителей международного терроризма, которые десятки лет сеяли хаос и разрушения на чеченской земле. В связи с этим, звание «Герой Чеченской Республики» нашло своего заслуженного и достойного обладателя.
Желаем Вам, Рамзан Ахматович, терпения, сил и успехов в Вашем нелегком деле! Вы - настоящий ТУРПАЛХО и весь чеченский народ Вами гордится!
#AkhmadHadji
#Warrior
#Turpalkhoy
#Chechnya
#Grozny
#Heroes
#Кадыров
#АхматХаджи
#Воин
#Турпалхой
#Чечня
#Грозный
#Герои
Наши бойцы всего за пару недель заставили в страхе зашевелиться весь мир. Враги наши делают все, чтобы ослабить наших бойцов… откуда им, дуракам, знать, что мужество и отвага невозможно ослабить и что наши бойцы не остановятся ни перед чем, чтобы выполнить приказ!
#100ЛЕТЧЕЧЕНСКОЙГОСУДАРСТВЕННОСТИ
#AkhmadHadji
#Warrior
#Turpalkhoy
#Chechnya
#Grozny
#Heroes
#Кадыров
#АхматХаджи
#Воин
#Турпалхой
#Чечня
#Грозный
#Герои
Президент России Владимир Владимирович Путин - тот человек, который остановил войну в ЧР, принес мир и каждый день заботился о том, чтобы этот мир сохранить. Человек, который своими словами и делами возвысил имидж нашего региона и религии. И идти за таким человеком для нас огромная гордость!
#100ЛЕТЧЕЧЕНСКОЙГОСУДАРСТВЕННОСТИ
#AkhmadHadji
#Warrior
#Turpalkhoy
#Chechnya
#Grozny
#Heroes
#Кадыров
#АхматХаджи
#Воин
#Турпалхой
#Чечня
#Грозный
#Герои
За правое дело хочется смиренно жить или же достойно умереть! Ты знаешь, что при любом исходе, ты был прав. Посему ты можешь себе позволить пошутить, посмеяться самому, а если требуется не моргнув глазом рискнуть всем.
#100ЛЕТЧЕЧЕНСКОЙГОСУДАРСТВЕННОСТИ
#AkhmadHadji
#Warrior
#Turpalkhoy
#Chechnya
#Grozny
#Heroes
#Кадыров
#АхматХаджи
#Воин
#Турпалхой
#Чечня
#Грозный
#Герои
Более двух десятков лет Глава ЧР, Герой России Рамзан Ахматович Кадыров и словом и делом доказал, что народ и его благополучие для неё в приоритете над всем остальным! Он столько лет так самоотверженно вел за собой народ, что теперь, любой чеченец, встанет за него горой и без сомнения не пожалеет своей жизни за его безопасность!
#100ЛЕТЧЕЧЕНСКОЙГОСУДАРСТВЕННОСТИ
#AkhmadHadji
#Warrior
#Turpalkhoy
#Chechnya
#Grozny
#Heroes
#Кадыров
#АхматХаджи
#Воин
#Турпалхой
#Чечня
#Грозный
#Герои
Наши опытные бойцы всегда пребывают в особом расположении духа перед каждым сражением. Когда враг думает как спасти свою жизнь, наши бойцы думают как истребить врага ни капли не переживая за свою. В этом мы отличаемся от бандеровщины и подобной швали.
#100ЛЕТЧЕЧЕНСКОЙГОСУДАРСТВЕННОСТИ
#AkhmadHadji
#Warrior
#Turpalkhoy
#Chechnya
#Grozny
#Heroes
#Кадыров
#АхматХаджи
#Воин
#Турпалхой
#Чечня
#Грозный
#Герои
Это нужно какой подлой и низкой падалью быть, чтобы звонить родственникам солдат и сообщать об их гибели, зная, что они в здравии, но не могут сами выйти на связь. Во все времена, люди даже за большие деньги отказывались сообщать такое родственникам когда это на самом деле было правдой. До чего же вы низко пали! Конечно, вы бы хотели чтобы наши бойцы ушли в праведный мир, но убегая с поля боя вы ничего не добьётесь! У вас нет мужества открыто вести вражду, так вы опустились до уровня телефонных пранкеров! Вы не воины, вы просто пранкеры!
#100ЛЕТЧЕЧЕНСКОЙГОСУДАРСТВЕННОСТИ
#AkhmadHadji
#Warrior
#Turpalkhoy
#Chechnya
#Grozny
#Heroes
#Кадыров
#АхматХаджи
#Воин
#Турпалхой
#Чечня
#Грозный
#Герои