Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Dr. Fischer
Steinbock Riesling
Германия 🇩🇪, Мозель-Саар-Рувер, белое, полусухое, крепость 12%, Рислинг.
Гордый козерог, как символ стойкости и бесстрашия в крутых поворотах жизни (козерогам привет🤘), конечно меня заинтересовал и не обманул ожиданием.
Блестяще, минерально, ароматно, а вкус требует повторного глотка.
В аромате цитрусы, ананас и стержень карандаша или мелка кохинор).
Вкус нежный, мягкий, живой, прекрасно сбалансированный, с интересной структурой и ярким послевкусием.
Ценник +/-1500р.
Чин!🍷
#Steinbock#Riesling
@pro_Wines
Lucien Albrecht
Riesling Reserve
Франция🇫🇷, Эльзас AOC, белое, полусухое, крепость 12,5%, моносорт Рислинг, 2019г.
Очаровательная, сдержаная классика. В бокале блестящее золото и салатовые блики.
В носу спокойный, стойкий аромат, минеральные тона, тонкие цитрусовые ноты, сухотравье и первоцветы.
Вкус с дружелюбной кислотностью, насыщен, как и аромат цирусовыми и минеральностью. Послевкусие да!, задумчивое, требующее повторного глотка.
Сможет полежать подождать вас в прохладе 3-5 лет, если вы к нему ппока ещё не готовы)
Ценник +/-1700р.
Замечен в магнолиях.
Чин! 🍷
#Lucien_Albrecht#рислинг
#Riesling
@pro_Wines
Сегодня 13 марта, международный день Рислинга и мне есть что сказать!
Рислинг для меня самый понятный сорт и достаточно лёгкий в уходе, но первые года урожай не давался легко, искали подход и даже больше 50% однажды срезали на землю. Печально, но факт.
Однако в 2023 году его Величество Рислинг приятно нас удивил и подарил прекрасный урожай! Настолько прекрасный, что некоторые виноделы просили меня продать виноград им!
Кстати, Riesling Domaine Bonamy 2023 мы скоро будем разливать по бутылкам и это вино будет готово одним из первых! Урожай умеренный и количество бутылок, соответственно, тоже!
За винификацию отвечал Дмитрий Маслов - наш профессиональный энолог, с которым мы сотрудничаем уже не первый год.
Оцениваем Рислинг 2023 как классное летнее, лёгкое и освежающее вино и с нетерпением ждём выпуска!
Photo by @koni_krim
#Riesling#рислинг#энолог#DomaineBonamy
Дорогие друзья! Наш дебютный Riesling Domaine Bonamy 2023 едет на фестиваль RieslingRoad, который состоится 25 августа, в Москве!
Ищите нас на стенде vino.ru, мы будем там! Регистрация на фестиваль 👉здесь
Будем рады всех видеть! 🥂
#riesling#rieslingroad
#DomaineBonamy#винору
Друзья! Лето - время рислингов и фестиваль RIESLING ROAD возвращается!
Фестиваль уже побывал в Санкт-Петербурге и Екатеринбурге и спешит в Москву.
В Москве 25 августа на веранде ресторана «Дом 16» (Покровский б-р, 16-18, стр. 4-4А) соберутся профессионалы рынка и поклонники рислингов на круговую дегустацию более 100 вин со всего света познакомиться с новинками от партнеров и продегустировать полюбившиеся вина! Мастер-классы, интересные спикеры и отличное настроение в эти жаркие дни обеспечено!
Следуй за рислингом вместе с нами!
Программа и билеты по ссылке. Сайт проекта: https://rieslingroad.ru
@rieslingroad#riesling#rieslinglover#rieslingwine#rieslingroad
Моя последняя любовь, учитывая ровное отношение к Рислингу.
Paddle Creek Riesling Rose
Lake Road
Новая Зеландия🇳🇿, Мальборо, розовое полусухое, купаж 97/3 Рислинг и Пино Нуар.
Лёгкое и приятное вино.
В бокале нежный прозрачный розовый цвет как уходящий весенний закат, чуть с рыжиной. В носу лекие красные фрукты, цитрусы, трава и... сама суть клёвого Рислинга - резина, велосипедная шина, машинное масло на тряпке в гараже .. Вкус маслянистый, не без тропических фруктов, с минимальной кислотностью. При этом хрустящее и свежее послевкусие.
Ценник +/-1100р.
Чин! 🍷
#дайтеДве#рислинг#rose
#Paddle_Creek#Riesling
@pro_Wines
Belmas Risling
Россия 🇷🇺, Крым (Севастополь), крепость 13,5%, моносорт Рислинг, о чём нам лаконично сообщено на этикетке Ri.
Отличный Рислинг из линейки, можно сказать, "Менделеев". Кстати, экземпляр занял высокую позицию в рейтинге лучших российских вин.
В носу персики, цитрусы, цветы и грушевые леденцы. Вкус идеальный - яркий, кислотный, нежно фруктовый с долгим интересным минеральным послевкусием. За оформление и внешний вид бутылки - респект. Очень стильно, да и вкусно)).
Ценник +/- 3000р.
Чин! 🍷
#Крым#Севастополь#Belmas#Riesling#Ri
@pro_Wines