Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Красавец европеец Citroen C5 Aircross в Major Expert. Red Dot Award и IF Design Award за дизайн. Стильный снаружи и внутри.
2019 год выпуска, пробег 94 тыс км, 1,5 л дизель на 131 лс, передний привод, АКПП. Панорамная крыша, навигация, парктроники и камера заднего вида. Второй комплект шин в подарок.
Цена - 2,084 млн руб
Менеджер Кирилл @KirStar96
#citroen
Restyled 🚘 C4 has been caught by spy photographers
The novelty will receive a number of external and internal improvements, including a new emblem on the steering wheel. The premiere of the restyled Citroen C4 will be held in October at the Paris Motor Show.
The engine range will consist of a new hybrid unit, including a 1.2-liter “turbo-troika”, 48-volt electric supercharger, robotic transmission with an integrated 29-horsepower electric motor and a lithium-ion battery.
In addition, 🚘 is testing the new electric C5 Aircross
The final stages of summer testing of the new e-C5 Aircross are underway in Europe.
The test mule is based on the Citroën C5 Aircross Hybrid, but the battery protruding from the underbody and the absence of an exhaust system give away the electric content.
@CarsNews
#Citroen#hybrid#EV
Рестайлинговый 🚘 C4 попался фотошпионам
Новинка получит ряд внешних и внутренних доработок, включая новую эмблему на руле. Премьера рестайлингового Citroen C4 состоится в октябре на автосалоне в Париже.
Моторную гамму составят из новой гибридной установки, включающей 1,2-литровую «турботройку», 48-вольтовую электронадстройку, роботизированную трансмиссию со встроенным 29-сильным электромотором и литий-ионный аккумулятор.
Помимо этого, 🚘 тестирует новый электрический C5 Aircross
В Европе проходят заключительные этапы летних испытаний нового e-C5 Aircross.
Тестовый мул создан на базе Citroen C5 Aircross Hybrid, но электрическую начинку выдает выступающий из-под днища аккумулятор и отсутствие выхлопной системы.
@avtoNovosti
#Citroen#гибрид#электрокар
Лобовое ДТП с пострадавшими возле поворота на Водогон.
Видео - https://youtu.be/DrHGsRT57x0
Водитель автомобиля #Kia двигался в сторону Киева, не справился с управлением, выехал на полосу встречного движения и совершил столкновение с автомобилем #Citroen в котором ехала семейная пара. Девушку-водителя #Citroen госпитализировали с незначительными травмами. На месте работает патрульная полиция, ожидают #СОГ.
Peugeot и Citroen создали новый бренд электрокаров - Hedmos🚙
Совместное предприятие автоконцернов Dongfeng Peugeot-Citroen (DPC), расположенное в Китае, планирует начать поставки первой модели — кроссовера Hedmos 06 — на китайский рынок уже в мае этого года 🤩
Что нам известно о новом кроссовере? 👇
🔹Габариты составляют 4670×1900×1617 мм, а колесная база — 2775 мм
🔹Двигатель мощностью 218 л.с. разгоняет автомобиль до 100 км/ч за 6,9 секунды
🔹Емкость батареи — 62,3 кВт·ч, а запас хода — 520 км по циклу CLTC
🔹Быстрая зарядка с 30 до 80% за 28 минут
Интерьер электрокара выполнен в минималистичном стиле без лишних “наворотов”. Ожидаемая стартовая цена новинки на китайском рынке составит 120 тысяч юаней (по нынешнему курсу это около 1,5 миллиона рублей) 💰
Как вы считаете, удастся ли Hedmos составить конкуренцию популярным китайским брендам? 🤔
#электромобиль#новыйБренд#Hedmos#Peugeot#Citroen#китай