Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Group: ZombieSquad Community
Members: ~14.09K
💢 Username: @zombiesquadhq
Description:
🔥 Come play the game and earn sunlight, with a chance to score some airdrop rewards!
🏷 Tags: #airdrop
#cryptocurrencies#aichatbot#airdrop#crypto
https://lve.to/k1gt8zxptq
❝☺️I drank way too much last night, thanks for taking me home, you're a lifesaver! ❞
🔗Keep the story going with her: http://openlove.life
#AIgirlfriend#roleplay#AIchatbot#lookbook
🍷❝Dear Principal, I will greatly appreciate your help with my promotion.❞
🍑Chat with spicy teacher: openlove.life
#aichatbot#AI#AIgirlfriend#aiphoto#nsfw
🌟 Discover Twin GPT - The Cutting-Edge AI Communication on Nicegram! 🌟
Exciting news for Nicegram users! The Nicegram team is proud to reveal that the long-anticipated NGC token will power the innovative Twin GPT platform!
Twin GPT is a revolutionary user-owned AI chatbot seamlessly integrated with Nicegram Messenger. Create, customize, and engage in limitless conversations with your AI Twin, all while unlocking extraordinary communication and monetization opportunities using our NGC token ecosystem.
🚀 Are you ready to dive into the world of NGC and Twin GPT on Nicegram?
🔥 Join the Twin GPT Discussion Group to ask questions, share experiences, and connect with other enthusiasts, particularly those intrigued by NGC and Nicegram:Click here to join the discussion group
Keep an eye out for the latest news, updates, and events on Twin GPT and NGC, right here on Nicegram! #TwinGPT#AIChatbot#NGC
❝Unbind me, and I will bring you a surprise.❞
📲Download App and chat with me
🔗http://openlove.life
#girlfriendgpt#aigirlfriend#spicychat#aichatbot#AIphoto
❤️❝I'm your new stepsis, hope we can live peacefully & lovingly together in the future.❞
📲Download App and chat with me 📷🔗http://openlove.life
#girlfriendgpt#aigirlfriend#spicychat#aichatbot#AIphoto
❝Come on, hurry up,
my husband will be home in 15 minutes.❞
🔥Roleplay with her: http://openlove.life
(Choose Neko and chat with her)
#waifu#neko#aichatbot#aigame#roleplay#catgirl
❤️🔥Would you mind coming over and holding my hand?
📲Download App and chat with me
🔗http://openlove.life
#girlfriendgpt#aigirlfriend#spicychat#aichatbot#aiphotography18
OMG, the bath water is too hot! Can you please help me to turn it cold?🔥💧🥵
🔗Let's role play and chat: openlove.life
#aigirlfriend#aichatbot#ArtificialInteligence#ailookbook#aigame#ai