Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
#吐槽
In reply to nevent1q…84kx
_________________________
ok, here, I found it.
quoting
nevent1q…rs88
Sunday is vibe day, so here we go, I vibed this thing in 10 min (7$), Your year on Nostr ! something like spotify’s wrap 🎇
https://nostr.museumhttps://npub1equrmqway3qxw3dkssymusxkwgwrqypfgeqx0lx9pgjam7gnj4ysaqhkj6.nosto.re/%E2%80%A8%E2%80%A8Much improvement since last time i used shakespeare, absolutely love the direction it went. 🫡 Stunning work ! #shakespeare
via Nostr@cxplay
S-s莎s翁w情q史s- 莎翁情史 Shakespeare in Love (1998)
直达链接:https://pan.quark.cn/s/66f2d7600094
#莎翁情史#Shakespeare in Love
#写我深情#恋爱中的莎士比亚
链接:https://link3.cc/sf_com
#电影#喜剧#美国#90年代
Teen Hamlet из серии «Средневековые войны», бумага, пастель, 43х43см, Doping Pong, 2026
#dopingpong#Shakespeare#teen#hamlet#LePetitPrince#littleknight#medievalwars
✍Всемирный день поэзии: там, где границы стираются словом ✍
Сегодня мы отмечаем Всемирный день поэзии — праздник, который напоминает нам о том, что великие строки не знают ни 🌐 географических расстояний, ни политических барьеров.
Когда Пушкин писал свои бессмертные строки, он вдохновлялся работами Байрона — британского поэта-романтика, чей дух свободы нашел отклик у русского поэта. «Цыганы» и другие страны поэта несут в себе отпечаток байроновских мотивов, переосмысленных сквозь призму Пушкина.
Британская поэзия ХХ века была бы иной без влияния русских мастеров слова. Т.С. Элиот, один из величайших английских поэтов прошлого века, признавался в своей зачарованности русской литературой. Его «Пустошь» созвучна апокалиптическим 🌋 видениям Александра Блока.
А знаете ли вы, что Иосиф Бродский, изгнанный из Советского Союза, нашел духовное родство в стихах Джона Донна? Именно британская метафизическая поэзия XVII века стала для него мостом между культурами и эпохами.
«Поэзия — это разговор души с душой через века», — писал Борис Пастернак, чьи переводы Шекспира открыли русскому читателю новое 💥 измерение британской поэзии.
В эпоху, когда многие двери закрыты, поэзия остается открытым окном, через которое души разных народов продолжают вести свой вечный диалог.
#WorldPoetryDay#ВсемирныйДеньПоэзии#Pasternak#Shakespeare#Бродский#LordByron
🎭 ALL THE WORLD'S A STAGE
The 15th Shakespeare Schools Festival South Africa (SSFSA) takes place from May 6 to 31, 2025, in Cape Town. 🇿🇦
Audiences can expect three weeks of bite-sized Shakespeare plays, as talented participants showcase abridged 30-to-40-minute performances of their choice — delivered in innovative and inspiring ways.
💬 “Shakespeare's stories are our stories,” says SSFSA founder Kseniya Filinova.
🌍 Since its inception in 2009, SSFSA has grown into Africa's largest youth drama event focused entirely on Shakespeare.
🇷🇺 In 2016, the Festival launched a pilot project in Russia:
👉https://www.facebook.com/ShakespeareSchoolsFestivalRU
🌐 Official website: https://www.ssfsa.co.za/
#Shakespeare#SSFSA#SouthAfrica#CapeTown#SchoolTheatre#Festival#ShakespeareFestival#TheatreInEducation#Russia#CulturalExchange#ShakespeareInAfrica#RussianCommunity#ShakespeareForAll