Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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 XXIV ALBA-TCP Summit, held in Caracas, marked 20 years since the bloc's founding. The alliance welcomed Palestine as an honorary member with "brotherly country" status, condemned Israel's “terrible crimes against humanity,” and pledged to hold a future summit in Palestine.
The final communiqué also called for Cuba’s removal from the US list of state sponsors of terrorism and demanded an end to the economic blockade against the island. Leaders reaffirmed their commitment to Latin American and Caribbean integration, peace, and sovereignty.
Read the full report here 👉🏼https://venezuelanalysis.com/news/alba-bloc-defends-peace-sovereignty-and-palestine-at-xxiv-summit/
#ALBA#InternationalSolidarity#RegionalIntegration
📰 NEWS | Latin American Leaders Preach Unity Against Trade Wars and Mass Deportations at CELAC Summit
At the IX CELAC Summit in Honduras, Latin American and Caribbean leaders condemned US-led sanctions, trade wars, and anti-migrant policies. Venezuela's Maduro urged the bloc to “reinvent itself” and adopt a general secretariat.
Leaders also rejected the Trump administration’s use of the Alien Enemies Act to deport Venezuelans, with reports confirming that most of the 2,500+ deported migrants have no criminal record. Some were even held in Guantánamo Bay before being returned.
🔗 Read our report here: https://venezuelanalysis.com/news/latin-american-leaders-preach-unity-against-trade-wars-and-mass-deportations-at-celac-summit/
#CELAC#Migration#RegionalIntegration
📰 NEWS | CELAC-EU Summit Urges Peace as Venezuela’s Maduro Warns of Caribbean ‘War Threats’
The CELAC-EU gathering in Santa Marta, Colombia, emphasized the two blocs' commitment to peace, cooperation and multilateralism. A final communiqué rejected "threats and use of force" amidst a US military buildup in the Caribbean.
Venezuelan President Nicolás Maduro addressed the summit, calling for a regional response to preserve the region's sovereignty and self-determination.
Read the full report here 👉https://venezuelanalysis.com/news/celac-eu-summit-urges-peace-as-venezuelas-maduro-warns-of-caribbean-war-threats/
#USMilitaryThreats#CELAC#RegionalIntegration#InternationalSolidarity
@RusEmbMalta Press release:
🇷🇺🇦🇲🇰🇿🇰🇬🇧🇾EAEU Turns 10: A Decade of Integration and Growth
On May 29, 2014, the Treaty on the Establishment of the Eurasian Economic Union (EAEU) was signed – marking the beginning of a new era of economic integration across Eurasia.
Over the past decade, the Union’s five member states – Russia, Armenia, Kazakhstan, Kyrgyzstan, and Belarus – have achieved remarkable results:
📈 In 2024, mutual trade within the EAEU reached nearly $100 billion
💱 Over 90% of settlements were made in national currencies
🌐 International cooperation is expanding rapidly
🔄 The internal market is functioning and evolving steadily
🤝 The EAEU demonstrates resilience amid global turbulence, offering a stable and non-discriminatory framework built on equality, mutual respect, and benefit.
Today, the EAEU is a growing center of gravity in international economic relations:
🌍 Four observer states – Uzbekistan, Cuba, Iran and Moldova
🤝 Free trade agreements with Vietnam, Iran, and Serbia
🤝 Non-preferential trade agreement with China
📜 Over 80 cooperation MoUs through the Eurasian Economic Commission
🪙Trade talks are underway with Indonesia, the UAE, Egypt, India, Mongolia, and others
🇱🇧 We welcome potential interest from our Lebanese friends in partnering with the Union.
Russia remains a consistent supporter of deeper coordination between the EAEU and other regional structures – including the CIS, ASEAN, and SCO – as part of building a Greater Eurasian Partnership, an idea first proposed by President Vladimir Putin in 2015.
🔗 The EAEU today stands as a model of successful integration – based on trust, equality, and shared benefit. We thank our partners and the Eurasian Economic Commission for their continued cooperation, and we look forward to unlocking even greater potential together – for the benefit of our peoples and businesses.
#EAEU#EurasianUnion#Eurasia#EconomicCooperation#Russia#Armenia#Kazakhstan#Kyrgyzstan#Belarus#Trade#EAEUDay2025#RegionalIntegration