Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Japanese from Zero! 1
by George Trombley, Yukari Takenaka
Japanese From Zero! 是由专业日语口译员George Trombley和合著者Yukari Takenaka开发的一种创新和综合的日语学习方法。这一系列的课程和技巧在全球课堂中成功教授了超过十年。使用现代且易于理解的语法,Japanese From Zero! 是目前日语学习者以及完全初学者的理想课程。
Japanese From Zero! 系列的第一本书中,读者将学习新的语法概念、超过800个新单词和表达方式,并掌握平假名书写系统。
———
终于将先前一直感兴趣想尝试的事情提上了日程,那就是把日语也学了。虽然不知道能学到什么程度,能学多少,但是好的开始是成功的一半+兴趣永远是最好的老师。
Japanese From Zero! 整个系列共有5本,我选择这个系列之前也是做了一定的搜索调查,对于日语入门这块的适宜材料,此系列在外网的认知度以及用户群体的评价都是相当可以的。日语词汇分为Hiragana、Katakana以及Kanji。昨天刚把系列第一本看完,整本书会带你学完日语中的所有Hiragana,并且每节课都配有课后练习。
此书在大陆没有上市且没有中文版,遂需要有一定的英文基础才可学习。不过因为是语言教材类书籍,所以本身使用的英文内容也不是非常复杂,还是好入手的。建议使用电子版的用户可以选择打印出来后,进行学习练习,或者像我目前一样,使用带手写笔的设备,直接在PDF上面标注和练习。
咱们下一本再见~
———
- 原版中文实体书:大陆未上市,无中文版
- 原版中英文资源:见评论区分享
- 原版有声书资源:本书无有声书版本
———
频道:xzの小站
#Ebooks#Books
Books change lives. Let us help you find the ones that will change yours. Join us! 🖊️📖📚📊
#booklovers#ebooks#bookrecoumandations
Join us @booksreviewer555
From classics to hidden gems, we review them all! Join and discover your next favorite book. 📚📊#booklovers#ebooks#bookrecoumandations
Join us @booksreviewer555
🏆 Bot of the Day 🏆
@eBukBot brings complete feedbooks (Public Domain) ebook catalog into Telegram. Browse recent additions, search by title, author and/or description, share them on chats sending ebook preview message and download in multiple formats. Just click and start reading!
Search eBooks in English, Spanish, German, Italian or French.
#eBooks#Public#Domain#Books