Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Andiamo per punti:
1 - È stato un "congresso" fiasco: ha coinvolto 4 gatti;
2 - Il PD è riuscito a perdere pure le sue primarie;
3 - È stato lo scontro tra il nulla e il niente;
4 - Rottamerà tutto perché non si rottami niente;
5 - Meloni non se la fila;
6 - Schlein non ha mai detto di no a Calenda (e Renzi!).
La mia al TG Plus di Cusano Italia TV
#politica#informazione#televisione#partitodemocratico#pd#italia#primarie#schlein
#Elezioni#Austria#Primarie
L'errore tecnico dovrebbe trattarsi del fatto che, quando sono stati pubblicati i risultati del congresso dell'#SPÖ|S&D, i due candidato hanno ottenuto 595 voti, ma risulta che i votanti sono stati 596.
@OsservatorioEsteri
#USA#Primarie#D
Come rivelato da Mediaite, Robert F. #Kennedy Jr. ha annunciato il suo ritiro dalle primarie democratiche per correre alle elezioni presidenziali del 2024 come indipendente.
@OsservatorioEsteri
#USA#Primarie#R
Nikki #Haley (#R|ECR): "È giunto il momento di sospendere la mia campagna. Ho detto che volevo che gli americani facessero sentire la loro voce. L'ho fatto. Non ho rimpianti. Anche se non mi candiderò più, non smetterò di usare la mia voce per le cose in cui credo."
@OsservatorioEsteri
#USA#Primarie#R#Colorado
La Corte Suprema del Colorado ha squalificato la candidatura di Donald #Trump nelle prossime primarie repubblicane nello stato.
@OsservatorioEsteri
#Elezioni#Portogallo#Primarie
Pedro Nuno #Santos vince le elezioni primarie del #PS|S&D e viene eletto nuovo Segretario del partito.
@OsservatorioEsteri
#Elezioni#Grecia#Primarie#SYRIZA
Stefanos #Kasselakis eletto nuovo leader di SYRIZA, di conseguenza sarà il nuovo leader dell'opposizione nel Parlamento Ellenico.
@OsservatorioEsteri
#Elezioni#Austria#Primarie
Capo della Commissione elettorale dell'#SPÖ|S&D Michaela Grubesa: "A causa di un errore tecnico, i voti sono stati assegnati in modo errato alla conferenza del partito. I voti dei due candidati sono stati invertiti. Andreas #Babler è quindi il nuovo leader del partito."
@OsservatorioEsteri
#Elezioni#Canada#Primarie
Mark #Carney è stato eletto nuovo leader del #LPC|Centro-sinistra con il 85,9% dei voti, succederà a Justin #Trudeau alla guida del partito e come Primo Ministro del Canada.
@OsservatorioEsteri
#USA#Primarie#D
Secondo il WP, gli stretti collaboratori di Bernie #Sanders (#VPP|Sinistra) riferiscono che il Senatore sarebbe pronto a candidarsi alle primarie democratiche nel 2024, qualora il presidente in carica Joe #Biden rifiutasse di correre per la rielezione.
@UltimoraPolitics
La rivoluzione con lui?
Immaginate di essere Elly Schlein: per mesi, a suon di supercazzole, avete raccontato alla gente di voler fare la sinistra, di voler fare la rivoluzione. Una campagna congressuale all'insegna di slogan e opacità.
Arriva il giorno della vittoria, siete nella stanza dei bottoni e avete le leve in mano (fingiamo sia davvero così…), e finalmente la possibilità di realizzare il vostro progetto di prossimità ai fragili.
Qual è il primo nome che vi viene in mente di convocare per dare lustro e prestigio alla vostra iniziativa? Bene, prendetevi qualche minuto per pensarci.
A Elly Schlein è venuta l'idea di convocare Mattia Santori, che ovviamente si è buttato "a pesce": che ve lo dico a fare?
Fine della storia.
La mia al TG Plus di Cusano Italia TV
#politica#informazione#televisione#italia#primarie#PD#PartitoDemocratico#EllySchlein#Schlein#MattiaSantori#Santori