Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🪂Newairdrop ~ Iron Titanium ✅️
💲 Reward: worth of 55,000 $TITAN + for each 10,000 #TITAN and top 300 refer and earn 600$usdt each more referrals
🌐WebsiteTiTan
💎 Presents Ratings: ⭐⭐⭐
👑Winners: 20,000 people valid participants will be randomly rewarded.
➡️Airdrop Bot For Iron Titanium
↪️ Join their Telegram group. and Telegram Channel. (Mandatory:)
↪️ Follow their Twitter, like and retweet the pinned post by tagging 3 of your friends. (Mandatory:)
↪️ Follow their Instagram
↪️ Submit your details to the Airdrop bot.
ℹ️Distribution date: announced by the project is the Immediately 55,000 Titan Withdraw .
🌎 Saturn’s moon Titan is the only place in the Solar System, other than Earth, with stable liquid lakes on its surface. These lakes are filled not with water, but with methane and ethane, and cover hundreds of square kilometers. ✨
#astronomy⚡#planets⚡#titan
👉subscribe Interesting Planet
👉more Channels
Голова для очень тяжёлых камер #titan ну так позиционируют Стоимость порядка 55 000 долларов, поставки будут в августе #bts#оборудование#newsfidllercom
🇬🇧Bloodborne_Free Comic Book Day #01
🇷🇺Передающийся через кровь_День Бесплатных Комиксов #01
Действие происходит в мире Bloodborne.
Город Ярнам, древний готический мегаполис в мире богов и монстров, пострадал от кошмарной чумы.
Церковь Исцеления, известная своими чудодейственными препаратами на основе крови, не знает, откуда взялась таинственная болезнь Пепельной Крови и как предотвратить её распространение среди жителей Ярнама.
По улицам в поисках зверей бродят Охотники - первая линия обороны от безумия. Но не всех монстров так легко распознать – в домах и сердцах людей страх и горе могут породить новый тип мучений…
#комикс#comics#bloodborne
#titan
🪐 Beneath the thick ice of Saturn’s moon Titan, scientists suspect there is a hidden ocean of liquid water mixed with ammonia, possibly deeper than 50 kilometers below the surface. Titan’s dense atmosphere, rich in methane, and its secret subsurface sea make it one of the most fascinating candidates for harboring life far from Earth. ✨
#moons⚡#oceans⚡#titan⚡#nasa⚡#galaxy⚡#stars⚡#astronomy⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries
👉more Channels
🪐 NASA's upcoming Dragonfly mission will send a robotic drone to Saturn’s moon Titan, using a nuclear-powered rotorcraft to explore its thick atmosphere and icy surface. This spacecraft will hop from site to site in search of complex organic molecules, pushing the boundaries of interplanetary exploration beyond anything ever attempted in the outer solar system. ✨
#spaceships⚡#exploration⚡#Titan⚡#nasa⚡#galaxy⚡#stars⚡#astronomy⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries
🪐 Saturn’s moon Titan is surrounded by a thick atmosphere richer in nitrogen than Earth’s, and it’s the only moon in our solar system with dense clouds and surface lakes made of liquid methane and ethane. This unique chemistry, combined with Titan's size—larger than the planet Mercury—makes it a standout among the many moons of the giant planets, offering a world where clouds, rain, and rivers exist far from the Sun. ✨
#giantplanets⚡#titan⚡#atmosphere⚡#nasa⚡#galaxy⚡#stars⚡#astronomy⚡#universe⚡#cosmos⚡#space
👉subscribe Universe Mysteries
👉more Channels
🇬🇧Dark Souls_The Willow King #1-4
🇷🇺Темные Души_Ивовый Король #1-4
Могучий король Утрель однажды возжёг пламя, но прежде его слуга рыцарь Герад не смог этого сделать, был поглощён пламенем и обратился в прах. Теперь пришла пора снова возжечь пламя, но Утрель воспротивился этому, став Ивовым Королём. Герад же возродился Негорящим и теперь должен объединить под своим командованием трёх могучих воинов. Они отправятся в логово Ивового Короля, чтобы заставить того исполнить долг перед королевством и человечеством.
#комикс#comics#темныедуши#darksouls
#titan