Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Coronado Island 🎏
Рядом с Сан Диего расположился Coronado Island. Небольшой островок, известен дорогими отелями и пляжами
На этом пока материал с Калифорнией закончился, вернулся в родную гавань
#CA
Коллеги делятся фотографиями с Калифорнийского парка Chino Hills State Park, красота нереальная.
В этом году зимой были проливные дожди, из-за этого бум маков.
#CA
#review
#shortStory#beginning
#CA
Grabbing her wrist. Rubbing the small space between her palm and the soft skin covering her veins. Traveling to the crease of her arm. She had worked hard today. Her clients were pleased with the outcome. Each one feeling a sense of ease and comfort from the constant energy surrounding them. Some came because pain in the physical sense. Others because something deeper. More hidden and yet still calling out. It wasn’t something she had learned in text or class. It was a part of her. This unending need to draw their pain, their confusion into her core. Transform it back into something able to give them rest. Her hands were something more than flesh and her heart was more than beat. She was filled with something that could not be described, only felt. A smile crossed her lips as the gratitude filled her soul. In a world where so many were without purpose. She had found hers.
#review#CA#poetry
Love isn’t the glance of eyes that lock in time. The words spoken of passion. A need or want for embrace. Love isn’t the nostalgia one feels with reminiscing. Love isn’t the sacrifice or the control of one’s fate. It isn’t the constant knowing of place or time. The inside workings of the mind. It’s the acceptance of separation. Of knowing this path is neither yours nor mine. It’s the walking of foot steps side by side allowing the division that plays in time.
#CA#review#shortStory
Listening to the rustling of the trees. Feeling the warmth of the sun. A moment a thousand words couldn’t describe. A stillness so profound she could feel the energy beneath the ground. Stirring below her feet. A vibration that traveled through her limbs and into her soul. She sighed with relief. A smile appearing at the corners of her mouth. A light within her eyes. This was perfect. She thought of how many moments wasted. Always staying busy. Having a mindset of lack. A constant want for more. How disturbing to be in that whirlwind. Never alone yet always cut away. She wondered how many others were in this realization. This dawning of a wisdom beyond age and time. She glanced at her palms as she turned them to the sky. Feeling the wind but never seeing it, all it’s wonder and beauty. A contentment filled her as she closed her mouth only letting her thoughts become her sound speaking to the energy all around and patiently waiting for its echo from the ground.
#review#shortStory#CA
What was it that transformed her? Were people just born like this? No it was like a path that swirled within her journey. An awakening. Suffering had been her constant and chaos her normal. Her escape was her imagination, her song, her dance. The way she saw such light touch everything. Knowing she was protected even though her physical world would prove otherwise. She had a blood line but not a family. She spoke with nature. Saw herself in creatures. Believed in the impossible. It wasn’t something she did that made the difference. When trying things it always seemed like an uphill battle. When allowing things. Her life shifted. She had a realization that everything in life had its place.
Остатки рандома из Сан Диего
В прибрежной зоне часто приливы/отливы. Можно увидеть прикольную живность, которая запряталась в камнях, но должно повезти. Нам не повезло
Зато повезло почти заехать на военную базу. Если выставить в картах BMW Cabrillo National Monument, то есть шанс, что он повезёт вас не туда, хотя въезд будет очень похож. С единственным отличием - на въезде будут военные, которые вас остановят и заберут ID на проверку
Ещё оказывается в серии Книг волшебника страны Оз больше книг чем я себе представлял, а писатель Фрэнк Баум жил в Калифорнии в своём доме "Ozcot" (от "Oz" и "cottage"), где и написал большую часть серии. Первую книгу он написал живя в Чикаго
#SanDiego#CA