Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
📱Top Social Networking Apps Worldwide by Downloads
May 2019
The most downloaded social networking app worldwide for May 2019 was #Facebook with more than 60.6 million installs. The markets with the most new Facebook installs during this period were India at 24% of total downloads, followed by Indonesia🇮🇩 at 12% and Brazil🇧🇷 at 8%.
#TikTok was the second most installed social networking app worldwide last month with close to 56 million installs, with the largest portion of those coming from India🇮🇳 at 57%, followed by China🇨🇳 at 8%. #Snapchat, #Instagram and, #Likee rounded out the top five most installed social networking apps worldwide for the month.
🔗 Read more on SensorTower.
🚀@PerspectiveIX
📡Pulse: Every Sunday.
❓What's you current favourite social networking app? Share it in the Comments.
📊Top Social Media Apps Worldwide for February 2020 by Downloads
#TikTok was the most downloaded social media app worldwide for February 2020 with 112.8 million installs, which represented a 96.2% YoY increase.
The countries with the most downloads of the app during this period were India 🇮🇳 at 41.3% of its total installs and Brazil 🇧🇷 at 8.6%.
#Facebook was the second most installed #SocialMedia app worldwide last month with 57 million downloads, which represented a nearly 8% increase from February 2019.
The countries with the largest number of Facebook installs were India 🇮🇳 at 23.8%, followed by Brazil 🇧🇷 at 9%.
#Instagram, #Likee, and #Snapchat rounded out the top five most downloaded social media apps worldwide for the month.
🦅@PerspectiveIX via SensorTower.
📱Top Social Media Apps Worldwide by Downloads
Q2 2019
#Facebook was the most downloaded #SocialMedia app worldwide for 2Q19 with close to 174 million installs.
#TikTok was the second most installed social media app worldwide last quarter with more than 156 million installs. #Instagram, #Snapchat, and #Likee rounded out the top five most installed social media apps worldwide for the quarter.
🔗 Read more on SensorTower.
❗️ Check our Instagram Stories!
🦅@PerspectiveIX
¿Qué puede hacer este bot?
@AllSavesBot
Descarga fotos, videos y audio de:
Instagram, YouTube, Facebook, TikTok, Pinterest, Twitter y Likee
Idiomas: Inglés, Ruso
#descarga#videos#fotos#audio#instagram#facebook#tiktok#pinterest#twitter#likee
(Visto en @BotsGram_Cu)
На расширенном заседании IT-Комитета ГД обсудили статус выполнения требований закона о «приземлении» IT-гигантов
⠀
Всего 13 компаний, которые попадают под требование закона. И уже большинство из них приступили к «приземлению». #Apple и #Spotify выполнили это требование, а #Wargaming и #AliExpress уже даже открыли представительства на территории РФ. В ходе заседания Комитета #TikTok, #Likee и #Viber также объявили о создании полноценных российских юрлиц, #Zoom тоже сообщил о начале процедуры «приземления».
⠀
Напомню, что закон о «приземлении» IT-гигантов позволит компаниям поддерживать российских пользователей, предоставляя возможность выражать свою точку зрения в рамках соблюдения законов внутри страны.
⠀
С целью ускорения процедуры Комитет подготовил поправки в Кодекс РФ об административных правонарушениях, которые устанавливают ответственность за «неприземление», а также за нарушение установленных ограничений – на рекламу, на сбор персональных данных.
⠀
Тем не менее ряд компаний до сих пор не выполнили ни одного пункта требований, и это: #Google, #Meta, #Discord, #Pinterest, #Twitch и #Telegram. Надеюсь, что конструктивный и живой диалог поможет развеять сомнения компаний и побудит приступить к соответствующим действиям.