Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Il cancelliere tedesco Olaf #Scholz non ha ottenuto la fiducia al Bundestag aprendo la strada alle elezioni anticipate a febbraio. Il cancelliere ha ottenuto 207 voti a favore, 394 voti contro. In 116 si sono astenuti. Per ottenere la fiducia Scholz avrebbe dovuto ottenere almeno 366 voti.
@UltimoraPolitics
Migranti, Giorgia #Meloni a Olaf #Scholz: “Mi auguro che gli esatti contorni di queste iniziative del tuo governo potranno essere meglio chiariti, e sarò lieta di discutere di persona della questione alla prima occasione utile, a partire dal Vertice Ccp e dal Consiglio Europeo di Granada il prossimo 5 e 6 ottobre” e aggiunge “occorre concentrarsi nel costruire soluzioni strutturali al fenomeno migratorio”.
@UltimoraPolitics
Migranti, Giorgia #Meloni a Olaf #Scholz: "Ѐ ampiamente noto che la presenza in mare delle imbarcazioni delle ong ha un effetto diretto di moltiplicazione delle partenze di imbarcazioni precarie che risulta non solo in ulteriore aggravio per l'Italia, ma allo stesso tempo incrementa il rischio di nuove tragedie in mare"
@UltimoraPolitics
Migranti, Giorgia #Meloni scrive al cancelliere tedesco Olaf #Scholz: "Ho appreso con stupore che il tuo governo - in modo non coordinato con il governo italiano - avrebbe deciso di sostenere con fondi rilevanti ong impegnate nell'accoglienza ai migranti irregolari sul territorio italiano e in salvataggi nel Mare Mediterraneo. Entrambe le possibilità suscitano interrogativi"
@UltimoraPolitics
ANSA - Il cancelliere tedesco Olaf #Scholz ha esortato il presidente russo Vladimir #Putin a ritirare le truppe dall'Ucraina e a negoziare con Kiev. Lo annuncia il governo tedesco. #Scholz ha parlato con il presidente ucraino #Zelensky prima di sentire il…
ANSA - Il cancelliere tedesco Olaf #Scholz ha esortato il presidente russo Vladimir #Putin a ritirare le truppe dall'Ucraina e a negoziare con Kiev. Lo annuncia il governo tedesco. #Scholz ha parlato con il presidente ucraino #Zelensky prima di sentire il leader russo.
@UltimoraPolitics
La polizia tedesca ha fatto irruzione nell’abitazione dello scrittore, giornalista ed ex parlamentare del partito di Unione Cristiano-Democratica (CDU) Jürgen Todenhöfer, a Monaco di Baviera, per una serie di post sui social in cui criticava il primo ministro israeliano Benjamin Netanyahu.
Secondo quanto riferito da Todenhöfer, gli agenti hanno confiscato telefoni e dispositivi digitali dopo aver monitorato la sua abitazione. “Un tribunale tedesco ha avviato un procedimento penale contro di me, emettendo un mandato di perquisizione e di sequestro di tutti i miei dispositivi, perché ho criticato duramente Netanyahu e Scholz”, ha dichiarato lo scrittore.
Nel post X al centro dell’indagine, Todenhöfer scriveva: "Signor Netanyahu, la sua coscienza non protesta mai quando fa ai palestinesi quello che i maledetti nazisti hanno fatto agli ebrei?".
#germany#netanyahu#scholz
Retour à l'histoire
Les tentatives de l’#Occident de réécrire l’histoire n'étonnent plus personne, sauf que cette fois-ci, il s’agit d’une tragédie mondiale, et d'un exploit pour toute l’humanité. Pour Olaf #Scholz, c’est aux États-Unis que l’#Allemagne doit sa liberté. Notre reporter Igor Kourachenko nous rejoint avec toutes les précisions.
RT en français • Osez questionner !
🇩🇪#Germania - Il cancelliere tedesco Olaf #Scholz ha rifiutato nettamente la proposta del ministro delle Finanze, Christian #Lindner, di indire nuove elezioni. - BILD
@UltimoraPolitics