Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
It's Mid-week!How are we feeling?
It's the third day of the week and a brand new opportunity to smash our financial goals and aspirations.
We hope you're not relenting in your pursuit of success? Keep grinding and keep your eyes laser focused on your goals.
As you continue in the week, avoid distractions and only spend time doing things that add value to you.
Brace up, the week hasn't ended yet!
#Join Our Trading Club👨🏻💻
#✅PropFirmChallenge&Verification
#👨🏻💻FUNDEDAccountManagement
#Join us at Excoincial exchange 2nd year Anniversary on #26 JULY 2020
LIVE AMA🤩📣
DogData CFO
Thomas Melchior
With the support
EXCOINCIAL Team
THE EVENT HOSTED ON AFRICUNIA TV
Facebook:
https://www.facebook.com/africuniatv
Instagram:
https://www.instagram.com/africuniatv
Zoom:
https://zoom.us/j/6331039454
JOIN AMA ON 26TH JULY 2020 AND DO NOT MISS THE CHANCE TO WIN 5 USD!
🐾📣🤩🚀🐾📣🤩🚀🐾📣🤩
Hey, Winners! Prepare to capture your victory with #Vision11.🏆📸
This photographic day, Play, Win, and Smile!💯
#Join the latest contest on #Vision11 with your skilled team, today and win Big!
https://vision11.in/APK/vision11.apk
🚨 You're missing out on the best forex signals out there! The clock is ticking, and these setups won’t wait. Join MENOW to get instant access to the VIP MENTORSHIP channel and take control of your trading before it's too late. Don't let this opportunity slip away! 💥📈
#JOIN NOW & #EARN GOOD
Hiring : Veterinarian
Position: Veterinarian
Location: bisrate gebriel, addis ababa
Type: Full-Time
Requirements:
• Degree in Veterinary Medicine, Animal Science, or Veterinary Science
• Proven ability to handle and care for animals with compassion and expertise
• Excellent communication skills and a strong commitment to client education
Female applicants are encouraged.
contact at +251954297102
#JOIN#Share ማድረጋችሁን አትርሱ👇👇
@vet_opportunities
@vet_opportunities
Рискованные инвестиции японских институтов развития
Японский фонд инфраструктурных инвестиций и городского развития (JOIN) зафиксировал совокупные убытки за 10 лет работы в размере 632,7 млн долл, из которых практически половина (276,3) млн долл. приходится на неудачный проект создания сети скоростных железных дорог типа «синкансэн» в штате Техас.
В рамках проекта предполагалось строительство высокоскоростного железнодорожного сообщения между Далласом и Хьюстоном в штате Техас. Финансирование было выделено американской компании Texas Central Corp.
Курирующее фонд Министерство земли, инфраструктуры, транспорта и туризма Японии проводит проверку обстоятельств принятия решения о выделении столь значительных средств в обход базовых принципов фонда.
Основной принцип государственно-частных фондов заключается в том, что японские компании являются основными инвесторами, а правительство берет на себя риски, вкладывая средства таким образом, чтобы они лишь дополняли частные инвестиции.
В случае с со строительством линии «синкансэн» в Техасе, государственный фонд JOIN стал единственным инвестором, частные японские компании в проекте вообще не участвовали.
Ранее JOIN потерял порядка 113 млн долл. в Мьянме, где проект был заморожен после правительственного переворота, а банкротство транспортного проекта в Бразилии обошлось еще в 50 млн долл.
Все эти расходы лягут на плечи японских налогоплательщиков. В результате все громче звучит вопрос о целесообразности сохранения подобного рода убыточных государственных фондов.
#Япония#JOIN#инвестиции#инфраструктура
Opportunity for Women Entrepreneurs!
The Bayer Foundation Women Entrepreneurs Award is back! This year, we're selecting 15 women founders in health and food security to join a six-month accelerator focused on one thing: building
investor readiness.
Powered by Impact Hub Network, the program is open to revenue-generating ventures across Asia, Latin America, Africa and the Middle East.
Apply by April 13th, 2026: bayerfoundation-wea.com
#JOIN#Share ማድረጋችሁን አትርሱ👇👇
@vet_opportunities
@vet_opportunities
@vet_opportunities
@vet_opportunities