Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
It is 'Telegram Thursday' and I want to recommend you interesting channels.
Today there is a fresh channel, focusing on the Scottish aspect of European culture:
https://t.me/beautiful_scotland
Have a look and follow this channel! It has lots of original content.
#Scottish#TelegramThursday
@EuropeanTribalism
#Ethiopia aid worker tells of daily struggle to find water in land littered with cow skulls
A #Scottish aid worker who recently visited Ethiopia has told of the harrowing daily struggles people face there to get safe water. Ben Wilson of the Scottish Catholic International Aid Fund (#SCIAF), who visited the #African nation last June, told of landscapes devastated by drought and littered with the skulls of dead cattle.
It comes as the charity’s annual Wee Box appeal this Easter focuses on water, with Scots urged to give generously to fund taps and wells in some of the world’s poorest nations. SCIAF is also urging Keir Starmer to reverse his controversial move to slash international aid to 0.3 per cent of national income - the lowest level since 1999 - in order to boost defence spending.
Ben told the Sunday Mail: “Water poverty is still such a huge problem around the world, with hundreds of millions of people.........
https://www.dailyrecord.co.uk/news/scottish-news/ethiopia-aid-worker-tells-daily-36969445
Shovel Dance Collective — The Shovel Dance (American Dreams Records, 2024)
#country#avantfolk#irish#scottish#english#England#Ireland#Scotland#United_Kingdom
Shovel Dance — второй альбом лондонского коллектива Shovel Dance Collective, который занимается изучением и переосмыслением народных традиций Англии, Ирландии и Шотландии. Группа работает без единого лидера, подчеркивая таким образом дух коллективного творчества, присущий фольклорной культуре. В состав входят девять участников, которые в работе над альбомом использовали 25 инструментов, а вокальные партии исполнялись восемью из них.
Альбом опирается на музыкальные источники, датируемые XVII веком и более ранними периодами, органично соединяя их с современными влияниями. Так, в музыке коллектива угадываются отсылки ко многим артистам XX века: Скотту Уокеру, начавшему карьеру как поп-исполнитель в 60-х, но позже экспериментировавшему со звуком и формой; Swans, экспериментальному постпанк-коллективу из Нью-Йорка; Ширли Коллинз, британской фолк-певице и исследовательнице народной музыки; Берту Ллойду, исполнителю и собирателю английских народных песен. Эти цитаты подчёркивают стремление Shovel Dance Collective навести мосты между традиционной музыкой и современными звуковыми решениями, чтобы отразить актуальность фольклора не только через тексты, но и через звучание.
Альбом открывается композицией Abbots Bromley Horn Dance — переосмыслением музыки к древнему английскому праздничному танцу, традиционно исполняемому с оленьими рогами и минимальным аккомпанементом. Группа превращает его в сложное инструментальное произведение, достигающее крещендо, прежде чем перейти к песне The Worms Crept Out времен Первой мировой войны, посвященной размышлениям о смерти.
На протяжении всего альбома музыканты исследуют, как фольклор может отражать социальные и исторические проблемы, актуальные как в прошлом, так и в настоящем. Например, в треке The Four Loom Weaver это проявляется через рассказ о людях, потерявших работу во времена промышленной революции. Хоть с тех пор минуло много лет и мы давно живем в постиндустриальную эпоху, люди продолжают терять работу. Музыканты верят, что старые народные песни могут стать источником утешения и помочь справиться с несовершенствами жизни.
🔗AppleMusic | Spotify | YouTube | Deezer | TIDAL | Napster | Amazon | Bandcamp | Telegram