Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🏆 2026 ASIA STAR ENTERTAINER AWARDS
ASEA Fan Choice Singer 🎤
🗓️ Ends: 17 May 2026
📱 My1Pick App
Link : Voting Link
fsn-app.my1pick.com/app/link/theme…
📱 Podoal App
Link : Voting Link
global.podoal.io/app/fandings/5…
📱 Mubeat App
Link : Voting Link
mubeat.applink.info/9hFE0waZsG
📍Check Comment Box for Tutorial
🤍💫 | #voting
@foreverbulletproof7
🏆 MUSIC AWARDS JAPAN
Best of Listeners’: International Song by Spotify
📣 Vote for DSYLM in Music Awards Japan Best of Listeners’ Choice!! 🏃♀️🫷
🗳️ 2 vts for Premium | 1 vt for Non-Premium
📆 Final voting ends on May 20
Link : open.spotify.com/playlist/37i9d…
📍Check Comment Box for Tutorial
🤍💫 | #voting
@foreverbulletproof7
🏆 SEOUL MUSIC AWARD 2026
BTS are nominated in 3 categories:
🏆 Korea Wave Award:
Link : promo-web.idolchamp.com/app_proxy.html…
🏆 Popularity Award:
Link : promo-web.idolchamp.com/app_proxy.html…
🏆 K-pop World Choice - Group:
Link : promo-web.idolchamp.com/app_proxy.html…
📝 Criteria: 100% voting
⏰ Ends May 28, 2026 23:59 (KST) on Idol Champ
📍Check Comment Box for Tutorial
🤍💫 | #voting
@foreverbulletproof7
🏆 Seoul Music Awards
🛑 Focus your votes on Korea Wave Award category!
⇢ Korea Wave Award - #1 BTS 57.85%
App: Idol Champ
Period: 05.08~05.28
Result: sum of all rounds
🤍💫 | #voting
@foreverbulletproof7
[🏆 2026 ASIA STAR ENTERTAINMENT AWARDS]
🛑 5 DAYS LEFT for Fan Choice Singer Final Voting
👉🏻 Status 🚨
▶️ Mubeat #4
▶️ Podoal #7 🔺
▶️ My1Pick #6 🔺
▶️ 100% Voting
▶️ until 5/17
🤍💫 | #voting
@foreverbulletproof7
Everyone please vote for BTS for Forbes Popularity on Mnet plus.
Voting is super easy, We do not have much time.
🔻 : https://play.google.com/store/apps/dev?id=4990449589140386036
🤍💫 | #voting
@foreverbulletproof7
The winners of AMAs will be announced at the AMAs Award Show 💜
⏰ DATE | TIME:
🇺🇸 May 25 at 8PM ET
🇺🇸 May 26 at 9AM KST
🤍💫 | #voting
@foreverbulletproof7
VOTE FOR BTS FOR FORBES POWER 40 CELEBRITY 2026
We’re falling behind fast 🔴 and the gap won’t close on its own
Start collecting MplePoints and cast your votes for BTS! 🌊🏄♂️
LINK : mnetplus.onelink.me/TRa8/xohkwx0b?…
🤍💫 | #voting
______
@foreverbulletproof7
______
BTS has been nominated for the ‘Power Celebrity 40’ list by Forbes Korea.
🏆 Prizes:
• Trophy
• Online PR
• Feature in Forbes Korea Magazine
📲 Vote via Mnet Plus App
Vote here: mnetplus.onelink.me/TRa8/xohkwx0b?…
Ends: May 10, 11:59PM KST
🤍💫 | #voting
@foreverbulletproof7
⚖️🗳️SUPREME COURT CASE COULD RESHAPE VOTING RIGHTS ACT
🔹 Louisiana v Callais challenges constitutionality of Section 2 of Voting Rights Act 📋
🔹 Case targets law prohibiting electoral discrimination based on race nationwide ⚡
🔹 Ruling against could eliminate or dilute Black and Hispanic-majority districts 💀
🔹 Up to nineteen Democratic-held seats primarily in the South at risk 🚨
🔹 Florida, Kentucky, Virginia pursuing mid-decade redistricting before midterms 🗺️
🔹 Governor DeSantis calls special legislative session for April redistricting 🏛️
Major implications for November midterms and minority representation 🔥📊
#USNews#voting
Trending Apps: Enhance Voting with Your Feedback
#Voting#Apps
Trending Apps introduces a new Voting feature and seeks user feedback to improve it. Users can report bugs, suggest improvements, or share ideas to help refine the Apps Center.
Source: link
@tonlines