Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
International Summer School 2026 | University of Oslo, Norway 🇳🇴 (Fully Funded)
Apply: https://opportunitiescorners.com/university-of-oslo-international-summer-school/
4 Week's Summer Program for International Applicants. The Program Covers Airfare, Accommodation, Stipend, Transport, Tuition Fees.
Deadline: 1st Feb 2026
#Oslo#Norway#OpportunitiesCorners
News: Renewed #Ethiopia–#Eritrea war could ignite conflict spanning 10–15 countries on three continents, trigger “Africa’s Second World War,” expert warns
A renewed war between Ethiopia and Eritrea could ignite a broader conflict involving 10–15 countries across three continents and risk becoming “#Africa’s Second World War,” a conflict expert has warned, according to a report by Anadolu Agency.
Speaking to Anadolu Agency, Kjetil Tronvoll, professor of peace and conflict studies at #Oslo New University College, said tensions between the two neighboring countries have sharply escalated and could draw in regional and international actors if fighting erupts.
The expert suggested that regional and international actors could still help prevent escalation by increasing diplomatic engagement, pressing Eritrea to end interference in Ethiopia’s internal affairs, encouraging negotiations over Ethiopia’s potential use of the port of #Assab.......
Read more: https://addisstandard.com/?p=55840
Large-scale transformation and adaptive re-use in Oslo🇳🇴
Images of the new proposal for Oslo Horizon - KLP’s high-rise hub - submitted to PBE / Oslo planning authority. The scheme seeks to transform a former post office terminal into a new gateway to Oslo central stations rail platforms, and creating a commercial multi-tenant office hub w.3500 workspaces, a hotel/ conference centre, foodcourt and cafe + over 3000 cycle parking spaces. Between tree branches in an extensive green roofscape the public can experience panoramic views of the Oslo Fjord and biodiversity in the heart of Oslo.
Oslo Horizon will be one of the Norway’s largest and most ambitious transformation projects, pioneering applications of re-use and recycling on an international scale.
Made by CF Moller Architects in collaboration with: kristin jarmund architects androdeo arkitekter.
#architecture#cfmoller#cfmollerarchitects#archilovers#improveLifeforPeopleandPlanet#dezeen#archdaily#oslo#norway#arch_shovel
Norvegiya haqidagi rasmiy risolalarda yozilmagan tafsilotlar: jurnalist bank kassiri va do‘kon sotuvchilari bilan suhbatlardan tortib, Oslodagi reklama va ishonch muhitigacha o‘z tajribalarini hikoya qiladi. Qimmat narxlar, yashirin xavf va hayrat uyg‘otuvchi kundalik hayot — Lillehammer va Oslo ko‘z oldingizda jonlanadi.
https://yep.uz/uz/2025/09/norvegiya-jurnalist-nigohida-lillehammer-oslo/
#norvegiya#lillehammer#oslo#sayohat#muzey#tabiat#madaniyat#norvegiya#sayohatjurnali#skandinaviya#nordik
Explore Norway through a journalist’s eyes: from the Olympic city of Lillehammer to Oslo’s city hall and royal palace. Discover sports facilities, nature, museums, and the unique Norwegian lifestyle.
https://yep.uz/en/2025/09/norway-through-journalist-eyes-lillehammer-oslo/
#norway#lillehammer#oslo#travel#museum#nature#culture#norge#traveljournal#scandinavia#nordic