Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
We have got our winners!🏆🎖
The top 10 #winners are here and will get a chance to meet Chennai Super Kings players. Thank you for participating in this contest. Let's keep playing and continue the winning journey!💰#Vision11
The M-session of the project took place today.
The following took part in the action:
28 TON-wallets
🏆20 participants received 200,000 BLC each
🎁 During the AMA one participant received:
1,000,000 BLC
All participants of the first stage will be invited to the closed chat of BLC Market testers and will receive the status of Pioneers with bonuses
The next stage of the project will be announced soon.
#giveaway#winners
FAQ | BUY
We are happy to Announce the #HEXN Meme Contest #Winners!
Congratulations #Winners (Twitter Handles)👇!
@ScaredHulk
@cryingrnf
@dionysuz_
@odukunelson
@uonyekiss
@crypto0harry
@greymegawin
@wangshuthian
@mr_h_kumawat
@BOSSSMUDA9
You have won 10$ per each winner. You will receive your reward on the platform 🏆🎉
🎉 Send us a DM with your Registered Email on #HEXN to claim your rewards! DM @MaxAttacker or our Twitter @hexn_io
If your weren't chosen this time around, don't worry! We love memes, so there's more contests on the way.
https://twitter.com/hexn_io/status/1623563743123902465
Dinos 🦖
The moment we’ve all been waiting for is almost here. It looks like something is about to pop up as we get close to hatching season. Are you ready to see what’s inside those mighty eggs you’ve collected ? Tik…Tok...
Show us your 🥚EGG collection,
We are #givingaway a 10M $CRACKA to 10 lucky #winners from the posted eggs, To enter:
1. Post your eggs under this tweet.
2. Share your TON wallet address
The top 3 winners will each receive 2M $CRACKA, the 4th and 5th place winners will receive 1M each and the remaining winners will receive 400k $CRACKA each.
Don't have EGGS yet? Don't worry, start collecting now and join the fun:
@MappasaurusAppBot
👀Follow us on:
Twitter|Instagram|Medium|Youtube|Linkedin| Facebook| Threads| Mastodon
CONGRATULATIONS FOR ALL WINNERS!🎆
You won the 5 $TON prizes in the contest
1. https://x.com/JisanHk67290/
2. https://x.com/mattmcap/
3. https://x.com/Zacker200302/
4. https://x.com/Crypt0jace/
5. https://x.com/Isabell_Krypto/
Pls DM us in X from your accounts and provide your TON wallet
😎Follow us on X and wait for the next contest!
#TON#winners#contest#TONEvents
🎉 Congratulations to the winners of the Massive Airdrop between SingSing and Cowtopia! 🥳
Check out the winners list here
Rewards will be distributed within the next 72 hours. Stay tuned! 🚀✨
#Airdrop#Winners#SingSing#Cowtopia#Web3#Crypto
🌟 ПІДСУМКИ ЛІДЕРБОРДУ НА REDSTAR! 🌟
Ось і результати нашого лідерборду на RedStar Poker! Вітаю переможців, які довели свій скіл на полі.
🥇 1 місце: MANUMBA
💰 Приз: $20
🥈 2 місце: RedStar113
💰 Приз: $10
🥉 3 місце: smak511
💰 Приз: $5
Призи будуть нараховані найближчим часом.
Дякую за активну участь усім гравцям!
Забирай 200% БОНУС на перший деп! + Ексклюзивні розіграші та призові ЛІДЕРБОРДИ для рефів! 🚀👉
📎 Реєстрація у RedStar
📎 Реєстрація у RedStar
📎 Реєстрація у RedStar
#RedStarPoker#PokerLeaderboard#Winners#Покер
O‘zbekiston jamoasini muvaffaqiyatli g‘alaba bilan tabriklaymiz!
💥 “Techno Mind” jamoasi “Aquatibia” loyihasi bilan Tech4Good global finalida ishtirok etib, “Silver Award” (ikkinchi o'rin)ni qo‘lga kiritdi.
🏆 Shuningdek, “People's choice award” tanlovida ham O‘zbekiston jamoasi g'oliblar qatoridan o'rin egalladi.
💧Aquatibia – qishloq xo‘jaligi uchun raqamli texnologiyalardan foydalangan holda integratsiyalashgan suv filtrlash tizimini yaratish loyihasi hisoblanadi.
🎗Yoshlarimizdan kelajakda bundanda yuqori natijalarni kutib qolamiz!
🔁English
➖➖➖➖➖➖➖➖➖➖➖➖➖
#SeedsfortheFuture#Aquatibia#global_final#winners#Tech4Good#TechnoMind
⬇️ Biz ijtimoiy tarmoqlarda:
Veb-sayt | Telegram | Instagram | Facebook
Youth Day – Winners of the Sports Competitions!
🏅💪On March 18, 2026, at Green University, sports competitions were held in celebration of Youth Day, and the winners were announced!
🏆Winners among male students:
🥇1st place: Khakimov Muhiddin (LAW-103)
🥈2nd place: Nurimov Diyorbek (LAW-102)
🥉3rd place: Toshpulatov Orifjon (EEP-101)
🏆Winners among female students:
🥇1st place: Bakhtiyorova Saodatxon (ESM-202)
🥈2nd place: Ulugmurodova Yasmina (LAW-104)
🥉3rd place: Qutbiddinova Mubina (LAW-104)
👏Congratulations to all the winners!
Your strength, dedication, and passion for sports inspire us!
#GreenUniversity#YouthDay#SportsCompetitions#StudentLife#Tashkent#Winners __________________
Yoshlar kuni – sport musobaqalari g‘oliblari!
🏅💪18-mart 2026 yil kuni Green University’da Yoshlar kuni munosabati bilan o‘tkazilgan sport musobaqalarida g‘oliblar aniqlandi!
🏆O‘g‘il bola talabalar orasidagi g‘oliblar:
🥇1-o‘rin: Xakimov Muhiddin (LAW-103)
🥈2-o‘rin: Nurimov Diyorbek (LAW-102)
🥉3-o‘rin: Toshpo‘latov Orifjon (EEP-101)
🏆Qiz bola talabalar orasidagi g‘oliblar:
🥇1-o‘rin: Baxtiyorova Saodatxon (ESM-202)
🥈2-o‘rin: Ulug’murodova Yasmina (LAW-104)
🥉3-o‘rin: Qutbiddinova Mubina (LAW-104)
👏Barcha g‘oliblarni tabriklaymiz!
Sizlarning kuchingiz, mashaqqatlaringiz va sportga bo‘lgan ishtiyoqingiz bizni ilhomlantiradi!
#GreenUniversity#YoshlarKuni#SportMusobaqalari#TalabaHayoti#Toshkent#G‘oliblar
✉️[email protected]
☎️ +998 55 512 00 77
📍Location
🌐Website | 📱Telegram | 📱Instagram | 📱LinkedIn | 🟥YouTube
🇷🇺 Οι Ρώσοι μαθητές κατέκτησαν 6 μετάλλια στη Μαθηματική Ολυμπιάδα
🏆 Οι μαθητές κέρδισαν πέντε χρυσά και ένα ασημένιο μετάλλιο στην 66η Διεθνή Μαθηματική Ολυμπιάδα, που πραγματοποιήθηκε στην Αυστραλία.
🥇 Χρυσά μετάλλια απονεμήθηκαν στους:
➡️ Ιβάν Τσασόβσκιχ, Χίμκι, Περιφέρεια Μόσχας
➡️ Ντμίτρι Γκρισκό, Μόσχα
➡️ Ιλιά Ζαμοτόριν, Αγία Πετρούπολη
➡️ Βασίλι Πάτρουσεφ, Βλαδιβοστόκ
➡️ Αρτέμ Σαντικοφ, Τσελιάμπινσκ
🥈 Το ασημένιο μετάλλιο κέρδισε ο Ιβάν Κόκαρεφ από το Τσελιαμπίνσκ.
🎊 Θερμά συγχαρητήρια στα παιδιά! Τους ευχόμαστε ακόμη περισσότερες επιτυχίες στο μέλλον!
🇷🇺 Российские школьники завоевали 6 медалей на математической олимпиаде
🏆 Ребята взяли пять золотых и одну серебряную медаль на 66-й Международной математической олимпиаде, которая прошла в Австралии.
🥇 Золотых медалей удостоены:
➡️ Иван Часовских, Химки, Московская область
➡️ Дмитрий Гришко, Москва
➡️ Илья Замоторин, Санкт-Петербург
➡️ Василий Патрушев, Владивосток
➡️ Артем Садыков, Челябинск
🥈 Серебряную медаль получил Иван Кокарев из Челябинска.
🎊 Поздравляем ребят и желаем новых побед!
@rossotrudnichestvo@rusembgreece
#Ρωσία#Μαθηματικά#ΔιεθνήςΟλυμπιάδα#RussianStudents#MathOlympiad#Επιτυχία#Νίκη#Διακρίσεις#Μαθητές#ΡωσικήΕκπαίδευση#Russia#Education#Success#Winners#Olympiad#Россия