Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🕵️#Vitalik continues selling $ETH.
In the past 2.5 days, he has sold 3,765 $ETH for $7.08M.
Since Feb 2nd, he has sold 10,723 $ETH for $21.74M at a price of $2,027.
Address: 0xfeb016d0d14ac0fa6d69199608b0776d007203b2
#ETH drop from the support zone might trigger -18% to -20% from the depicted zone, Keep an eye on!!📉
$ETH #ETHUSDT#Vitalik
https://x.com/CryptoBull_360/status/2025739068110487794?s=20
Vitalik Embraces New Milady NFT!
Vitalik Buterin has purchased a Milady NFT and updated his profile picture on X to showcase it. This marks another high-profile acquisition in the NFT space. Read more here.
#Vitalik#Milady#NFT#X#Crypto
📊
🔷⬇️🚨以太坊 基金會 再次出手!鏈上數據 顯示,基金會 近期持續 減持 $ETH 以補充營運資金。
#加密貨幣#區塊鏈#幣圈#以太幣
——— 📊市場情緒觀察 📊———
⚡️曝光新聞👇👇資源搜索群 🖲️👆
💰減持數據一覽:
• 出貨總量: 3,750 $ETH
• 變現總額: 830 萬美元
• 出場均價: $2,214
• 目前國庫餘額: 1,250 $ETH(價值約 277 萬美元)
💡重點分析:
1. 營運支出: 基金會通常在固定週期賣出 ETH 以支付全球開發者薪資及項目資助金(Grants),屬於預期內操作。
2. 逃頂大師再現? 社群始終高度關注 EF 的賣出時機。歷史上 EF 的減持點位常與市場階段性高位重合,本次 $2,214 是否具備參考價值值得深思。
3. 持倉縮減: 隨著國庫中 ETH 直接持倉降至低位,未來基金會可能更傾向於長期財務規劃。
📝原文摘要
The Ethereum Foundation continues to sell $ETH, having sold 3,750 $ETH for $8.3M at an average price of $2,214.
It still has 1,250 $ETH remaining, valued at $2.77M. link
#CryptoNews#Vitalik#行情#鏈上數據
🤣👇
☕️👇 幣圈 区块链新闻
😺👇
Major Unlockings Impacting Crypto Markets
🔑 Over $5M in large unlocks coming in 7 days, affecting tokens like APT, MOVE, and NEON. Total unlocking value surpasses $759M! For more details, visit Tokenomist.
🐦 Vitalik Buterin sells 340B DOG for 5.204 ETH (~$18.9K). Holding 8T DOG valued at ~$483K. Previous sales funded charity. More info here.
💬 Altman confident in AGI development this year.
📄 Buterin's new article on AI regulation, crypto's role in d/acc, and public financing. Read it here.
📈 Metaplanet aims to boost Bitcoin holdings to 10,000 BTC using loans and equity. Current holdings: 1,762 BTC. Full story here.
#Crypto#Unlocks#BTC#Vitalik#AGI#Memecoin#AI#Dogecoin#Altman#Investments#MarketTrends#MetaPlanet#BitcoinHoldings#ETH#MemecoinSales#Charity#PublicFinancing#AIRegulation#dacc#Tokenomist