Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Taste of Africa: Музыка без границ: русская гармония + африканский ритм 🎹🌍🥁
Все народы Земли объединяет наличие языка и музыки. Музыка и язык в мозге тесно связаны 🎶 Музыка проходит сквозь эпохи и континенты и соединяет то, что на карте выглядит раздельным🧭✨
В начале XX века русский композитор Александр Скрябин искал гармонию как пространство, выходя за пределы понятий «вопрос–ответ», напряжение–разрешение, он искал состояние: звук, который будто зависает в воздухе, светится изнутри, существует между нотами 🌫️🎼 Он мечтал о синтезе искусств - о музыке как силе, способной менять человека и мир 🔥🎨
А в это же время по другую сторону Атлантики рождалась стихия, основой которой стал пульс ❤️🥁 Африканские ритмические принципы, повтор, смещение акцентов, многослойность, полиритмия.
Джаз оказался местом встречи ритма и гармонии🎷✨
Когда в конце 1950-х джаз начал освобождаться от «жёстких коридоров» гармонии и идти в модальность и атмосферу, в нём стало больше воздуха 🌬️ Гармония перестала диктовать маршрут и стала ландшафтом 🏞️🎹 А африканская ритмическая энергия - тем мотором, который удерживает эту красоту во времени ⏳🥁
Так и родился один из самых важных культурных симбиозов
• русско-европейская гармония дала джазу новые краски 🎨
• африканский ритм сохранил телесность, свободу и огонь 🥁
• вместе они сделали музыку, которая стирает все границы 🚫🗺️
Сегодня этот диалог продолжается в world music, афро-джазе и фьюжне - везде, где музыканты соединяют культуры звуком 🎵
Если в мире начинает преобладать принцип «разделяй и властвуй», то всегда есть альтернатива «Объединяй и Здравствуй»!
Простая практика: включить музыку и услышать, как человечество говорит на одном языке 🌍
🎧 Что поставить сегодня: Miles Davis — “Kind of Blue” 🎺💙
https://moochinaboutltd.bandcamp.com/track/flamenco-sketches-kind-of-blue
и рядом — Скрябин 🎹✨ (любая поздняя фортепианная вещь, где гармония становится светом 💡). Слушайте связь 🔗🎶
🌟 Ритмическое путешествие продолжается – в языке музыки🌟
#TasteOfAfrica#МузыкаБезГраниц🌍#Джаз🎷#Скрябин🎹#AfricanRhythms🥁#WorldMusic🎶#СимбиозКультур🤝✨
🗣️🎶 Taste of Africa: Язык и музыка
🌟🔔 «Ритмическое путешествие продолжается!» 🥁🌟
Когда речь становится ритмом, а мелодия — смыслом 🥁
В Африке язык и музыка часто звучат как единое целое, и это ощущается даже при первом знакомстве. В ряде языков региона (например, Yorùbá, Igbo и многих других) значение передают и слоги, и высота произнесения.
📌 Тональные языки используют тон (высоту голоса) для различения значений. Одна и та же последовательность звуков, произнесённая выше или ниже (или с другим контуром), передаёт другое слово.
Ключевая мысль рубрики:
🎼 в песне мелодия работает как часть смысла и помогает ему звучать точно.
🎤 1) Как язык задаёт форму вокалу
Тональная речь направляет вокальную линию к смысловой точности, поэтому в музыке часто встречаются такие решения:
🗣️ Вокал как речь: мелодия держится в узком диапазоне, звучит как разговор, уложенный в ритмический узор.
🔁 Хуки‑формулы: важная фраза повторяется, смысл закрепляется и становится общим.
👥 Call-and-response (вопрос–ответ): лидер произносит строку → хор отвечает и поддерживает. Формат создаёт ощущение общинного согласия: “мы услышали, мы повторили, мы поняли”.
🥁 2) Барабаны как продолжение языка
Связь языка и музыки проявляется и через ритм речи. У каждой этнической традиции формируется свой набор привычек:
⏱️ акценты
✂️ паузы
📌 группировки слогов
⚡ ускорения и “перебросы”
🥁 Барабанные рисунки часто отражают эти принципы: ритм становится моделью речи.
Поэтому в ансамблях барабаны звучат как участники диалога:
отвечают голосу “репликой”,
поддерживают ключевую фразу,
закрепляют смысл повтором,
в ряде традиций передают сообщения и статус через говорящие барабаны и кодированные сигналы.
🎧 Как услышать это в треке:
представьте вокальную строку как фразу, произнесённую вслух. Когда перкуссия попадает в те же акценты, возникает ощущение разговора внутри музыки.
🌍 3) Кого послушать сегодня (по странам) 🎶
Под тему отлично подходят артисты, у которых композиция строится на риторике, повторе, коллективном ответе и “говорящем” груве.
🇳🇬 Нигерия
• Fela Kuti — длинная музыкальная “речь” поверх гипнотического грува 🔥
fela-kuti.bandcamp.com
• Seun Kuti & Egypt 80 — лозунг‑фраза ↔ ответ, энергия сообщества 👥
seunkuti.bandcamp.com
🇬🇭 Гана
• Ebo Taylor — highlife/afro-funk, где риффы звучат как реплики 🎸
ebotaylor.bandcamp.com
• Gyedu-Blay Ambolley — речевой фанк/highlife 🗣️
gyedublayambolley.bandcamp.com
🇸🇳 Сенегал
• Orchestra Baobab — ансамбль как разговор: слои ответов и мягкий грув 🧵
orchestrabaobab.bandcamp.com
🇲🇱 Мали
• Ali Farka Touré — фразировка как интонация речи, музыка “рассказывает” 🌀
alifarkatoure.bandcamp.com
• Tinariwen — сила повтора и коллективного звучания 🌙
tinariwen.bandcamp.com
🇬🇳 Гвинея
• Bembeya Jazz National — городская оркестровая традиция, где ритм держит “сюжет” 🎺
bembeyajazznational.bandcamp.com
🇪🇹 Эфиопия
• Mulatu Astatke — этно‑джаз: интонации и паузы как пунктуация 🎷
mulatuastatke.bandcamp.com
🇿🇦 ЮАР
• Hugh Masekela — инструмент “говорит”: вопрос–ответ, паузы, реплики 🗣️🎺
hughmasakela.bandcamp.com
🇹🇿 Танзания
• Siti Muharam — суахили‑песня: текст и интонация ведут аранжировку ✨
sitimuharam.bandcamp.com
🎧 4) Мини‑упражнение (2 минуты)
Выберите любой трек из списка и отметьте:
🎤 где вокал поёт, а где говорит/скандирует
🔁 какие фразы повторяются как “формулы”
🥁 где ритм‑секция отвечает голосу — как подтверждение смысла
🔄 Сохраняйте пост и приглашайте друзей в наше увлекательное путешествие вокруг света африканских ритмов!🎶🌍
#TasteOfAfrica#ЯзыкиАфрики#ЯзыкИМузыка#АфриканскаяМузыка#ТональныеЯзыки#Этномузыка#WorldMusic#AfricanRhythms#Drums#TalkingDrum#Djembe#CallAndResponse#Afrobeat#Highlife#AfroJazz#WestAfrica#EastAfrica#SouthAfrica#Nigeria#Ghana#Senegal#Mali#Guinea#Ethiopia#Tanzania#FelaKuti#SeunKuti#EboTaylor#OrchestraBaobab#AliFarkaToure#Tinariwen#MulatuAstatke#HughMasekela#SitiMuharam