Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Merayakan Kebaikan: Terima Kasih Para Dermawan
Sebuah acara yang diperuntukkan bagi siapa saja yang terlibat dalam gerakan #SalingJaga Hadapi Corona. Sebuah gerakan yang diinisiasi oleh Jaringan GUSDURian dan @islamcinta.co bersama @kitabisacom.
Acara dilangsungkan pada hari Sabtu, 22 Agustus 2020 pukul 19.00-22.00 melalui Zoom Cloud Meetings dan live streaming di Fanpage Facebook KH. Abdurrahman Wahid.
Akan ada talkshow, testimoni, pembacaan puisi, dan stand up commedy.
Jangan sampai dilewatkan ya...
UPDATE CORONA
27 Juli 2020
Kasus terkonfirmasi meningkat 1.525 orang.
Total 100.303.
Kabar baiknya angka sembuh bertambah 1.518 orang.
Total 58.173.
Sementara pasien yang meninggal bertambah 57 orang.
Total 4.838.
Semoga wabah segera bisa dikendalikan. Amin...
#SalingJaga
UPDATE CORONA
568 Kasus baru per 14 Mei 2020.
Total
16.006 kasus positif
11.445 dalam perawatan
3.518 sembuh
1.043 meninggal dunia
Semoga kita semua mendapat perlindungan dari Tuhan Yang Maha Kuasa. Dan semoga wabah ini segera berakhir. Amin. #SalingJaga
UPDATE CORONA
689 Kasus baru per 13 Mei 2020.
Total
15.438 kasus positif
11.123 dalam perawatan
3.287 sembuh
1.028 meninggal dunia
Semoga kita semua mendapat perlindungan dari Tuhan Yang Maha Kuasa. Dan semoga wabah ini segera berakhir. Amin. #SalingJaga
UPDATE CORONA
484 Kasus baru per 12 Mei 2020.
Total
14.749 kasus positif
10.679 dalam perawatan
3.063 sembuh
1.007 meninggal dunia
Semoga kita semua mendapat perlindungan dari Tuhan Yang Maha Kuasa. Dan semoga wabah ini segera berakhir. Amin. #SalingJaga
UPDATE CORONA
367 Kasus baru per 6 Mei 2020.
Total
12.438 kasus positif
9.226 dalam perawatan
2.317 sembuh
895 meninggal dunia
Semoga kita semua mendapat perlindungan dari Tuhan Yang Maha Kuasa. Dan semoga wabah ini segera berakhir. Amin. #SalingJaga
UPDATE CORONA
484 Kasus baru per 5 Mei 2020.
Total
12.071 kasus positif
9.002 dalam perawatan
2.197 sembuh
872 meninggal dunia
Semoga kita semua mendapat perlindungan dari Tuhan Yang Maha Kuasa. Dan semoga wabah ini segera berakhir. Amin. #SalingJaga
UPDATE CORONA
292 Kasus baru per 2 Mei 2020.
Total
10.843 kasus positif
8.347 dalam perawatan
1.665 sembuh
831 meninggal dunia
Semoga kita semua mendapat perlindungan dari Tuhan Yang Maha Kuasa. Dan semoga wabah ini segera berakhir. Amin. #SalingJaga
GUSDURian Peduli Covid-19
Update info tentang pencegahan covid-19 dan update distribusi bantuan di akun resmi GUSDURian Peduli.
*IG: @gusdurianpeduli*
https://instagram.com/gusdurianpeduli?igshid=q6tsn1wovqsp
*Twitter: @gusdurianpeduli* #SalingJaga
https://twitter.com/gusdurianpeduli?s=08
*Facebook: Gusdurian Peduli*
https://www.facebook.com/gusdurian.peduli.9