Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🤩1,000,000 Users in Gamety's Telegram App! 👍
Celebration prize: 250$
Show your love in comments on the Tweet, tag 2 friends and post your BNB wallet. 🔥
This massive milestone is just the beginning, so join the excitement and earn your share of 17.5 Million $GTY 💎 tokens with our gamified Airdrop campaign!
➡️ Go to @GametyApp_Bot now!
Next Step…bring our user #onchain👍
Stay tuned for more big news!
Tweet 🔗:
https://x.com/gametyio/status/1795435819529802165
📎Important Links:
Website | X | Chat | Discord | Announcement | Youtube
⚖️Unlock the advantages of advanced onchain analytics with 10 Bonus Free Days exclusively for Multichain Score holders!
Partnering up with ArbitrageScanner, an ecosystem of #onchain analysis and #cryptocurrency arbitrage products, to deliver more meaningful degen experience for the folks with solid onchain reputation 💪
P.s. ArbitrageScanner is already powering the Nomis Leaderboard—check it out to see how it works!
👇Click the button below to check the offer details and claim your Free Days on available subscriptions!
💠Nomis tApp | X | Discord | YouTube | Check Scores⚖️
🚨MVB 8 Celebration Campaign IS NOW LIVE!
For sure, the smartest move to leverage your brand-new BNB Rep Score which has just launched on BNB Chain by #Binance⚡️
Proud to become a part of BNB Chain ecosystem and share this milestone with YOU in our new campaign linked to our participation in the Accelerator!
🗓1-WEEK duration:
💵Unlimited reward pool starting at $5K
🌱10+ BNB Chain Eco projects w/ perks
❗️ The Score determines your profit! Explore partner planets, complete tasks, and claim your well-deserved rewards — it's that simple!
Your #BNB Score is a power — cause its all about your #onchain reputation on BNB Chain 🌐
Get it, Leverage it, Be Rewarded for holding it 💜
And Stay Tuned for Next Thrilling News 🫵 (We're preparing another cash giveaway 🤑)
🎉 Hello, 2025, from SpotOnChain!
Thank you for an incredible 2024. Big things are coming this year, including the launch of our AI-powered trading agent and the highly anticipated $SOCAI token. 🚀
Here’s to redefining your crypto journey together in 2025! 🥂
#OnChain#SpotOnChain#SOCAI
$ONSING ~ the protective big brother of $PUNCH 🛡️🔥
Solid structure.
Higher highs.
Clean continuation.
Early participants secured partials and continue to ride the trend.
This token builds sustainably, not just pumps.
3AZAjwZZCe8Jf4yccheZ5Z1c2SPEPyoYJHFT3Le2pump
Big brother energy.
#Memecoins#Solana#Crypto#OnChain#Teslacalls🚀
Create/Import your #BASE wallet on #TokenPocketExtension! BuildOnBase
✅In-extension #Base Tokens Cross-chain Swap.
✅Connect with third-party websites in a snap.
✅Smoothly operation and New Interface experience.
👇Add #TokenPocketExtension to your Chrome
https://chrome.google.com/webstore/detail/tokenpocket/mfgccjchihfkkindfppnaooecgfneiii?hl=en
#onchainsummer#OnChain#BASE
【Details】https://twitter.com/TokenPocket_TP/status/1691758198003532191
【Powered By】Crypto Box
🎉 Milestone Alert! 🎉
SingSing has officially surpassed 1.2 MILLION on-chain transactions! 🚀
Thank you to our incredible community for making this possible. Here’s to many more milestones ahead! 💪✨
Read more and open treasure at: X Post
#SingSing#Blockchain#Milestone#OnChain#CryptoCommunity