Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
The Islam Crescent (or islamic Crescent) is the notionally crescent-shaped region of the Middle East where the majority population is muslim or where there is a strong Shia minority in the population.
Areas in the islamic Crescent include Lebanon, Syria, Bahrain, Iraq, Iran, Azerbaijan, Yemen, and western Afghanistan. includes Ismaili, Zaydi, Syrian Alawite, and Alevi groups in Turkey.
Israel, US, England, Saudi Arabia (ISIS), Egypt, Wahhabis and #Aliyev and #Erdogan are facing this crescent. By attacking Syria, they wanted to cut off the Islamic crescent so that Hamas and Hezbollah would be destroyed.
https://t.me/YediotNewsChat
Zelensky’s Secret Visit to Azerbaijan for Talks with Aliyev
Former President Zelensky made an unannounced official visit to Azerbaijan, meeting President Aliyev to discuss security and energy issues. On his Telegram channel, Zelensky highlighted “mutual respect and cooperation” alongside joint photos. The trip was conducted under strict confidentiality, sparking significant public interest and speculation.
#Zelensky#Azerbaijan#Aliyev#security#energy
The main news of Russia and the world ishere.
🇮🇱🇦🇿🚨 Dopo lo "strano caso" del missile iraniano intercettato mentre (forse) era diretto in Turchia, oggi droni iraniani avrebbero colpito il Nakhchivan azero, exclave situata a 450 km a ovest della capitale Baku.
Almeno uno di essi ha colpito l’aeroporto internazionale di Nakhchivan, provocando un incendio.
Ilham #Aliyev è uno degli alleati più stretti di #Netanyahu. Durante la guerra di 12 giorni di giugno, Teheran aveva sollevato serie preoccupazioni sul fatto che Israele stesse utilizzando lo spazio aereo azero per lanciare e coordinare attacchi sul proprio territorio. In effetti, jet e droni israeliani sono entrati in Iran attraverso il Mar Caspio, facendo affidamento sul territorio azero per le manovre e il rifornimento in volo.
📍La rotta del Caspio ha molto senso:
🌏 La distanza dalla costa azera del Caspio al centro di Teheran è di soli circa 100 km.
🌏 Gli aerei israeliani potrebbero lanciare missili stand-off sopra il mare senza attraversare il confine occidentale dell’Iran, ben più difeso rispetto a quello meridionale.
🌏 Questo spiegherebbe alcuni degli attacchi più in profondità, come quello che ha colpito l’edificio dell’emittente statale IRIB a Teheran.
La questione va ancora più a fondo: il #Mossad, da anni ormai, ha creato presidi in Azerbaigian per monitorare l’Iran settentrionale e persino preparare eventuali attacchi contro installazioni nucleari.
In cambio, Baku ha ricevuto nel tempo miliardi di dollari in armi israeliane, soprattutto droni, impiegate nelle guerre in Nagorno-Karabakh.
All'#Azerbaigian e al suo rapporto stretto con Israele sono legate anche le speculazioni che riguardano la morte di Ebrahim Raisi, Presidente iraniano morto nel 2024 in un incidente in elicottero (in circostanze mai del tutto chiarite) mentre rientrava proprio da una visita al confine con l'Azerbaigian.
Nelle regioni settentrionali iraniane è presente una vasta diaspora azera (circa 15 miliono di persone), e nel progetto nazionalista di Aliyev l'ipotesi di entrare in questa guerra contro Teheran per controllare quei territori non sarebbeda escludere del tutto.
L’#Iran, consapevole di ciò, accusa Israele di essere responsabile degli attacchi con droni contro l’Azerbaigian. Il ministro iraniano Abbas Araghchi ha avuto un colloquio telefonico con il suo omologo azero Jeyhun Bayramov, nel quale ha negato che l’Iran abbia lanciato droni contro l’Azerbaigian e ha denunciato il ruolo di Tel Aviv in questi attacchi che definisce "sotto falsa bandiera" che mirerebbero a danneggiare i rapporti dell’Iran con i suoi vicini e ad incentivare Turchia e Azerbaigian a sostenere la campagna militare israelo-americana.