Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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 opinion of our friend from the Telegram channel Jus Humanum
If you don't like your history, just make up a new one!
(A recipe tested by all national histories).
Ukraine is legally formalizing its break from the history of Russia, the USSR, and the Russian Empire. (And from common sense too, but they've long since abandoned that).
On August 21, Ukraine's Verkhovna Rada adopted the law "On the Fundamentals of State Policy on the National Memory of the Ukrainian People."
☝️The law was prepared by the Ukrainian Institute of National Memory under the leadership of Volodymyr Viatrovych.
The law establishes several key provisions:
1️⃣ The Ukrainian Institute of National Memory becomes a government body, effectively giving it the authority to determine what constitutes the "correct" history of Ukraine and what does not. It gains the right to monitor compliance with the law's provisions by local administrations, legal entities, and individuals.
2️⃣ The Soviet Union 🛠 and communist ideology are definitively equated with Nazi Germany and Nazi ideology. (Although no specific measures are proposed to combat Nazi symbolism.)
3️⃣ Russia is declared a neo-Nazi state. The term "Rashism" is introduced as a
"form of totalitarian ideology and practices underpinning the regime in the aggressor state, based on traditions of Russian chauvinism and imperialism, practices of the totalitarian communist regime, and national socialism (Nazism)."
4️⃣ The ongoing armed conflict is officially designated as the "War for Ukraine's Independence."
5️⃣ New rules are introduced for memorial sites of the Great Patriotic War—eliminating all Soviet, Russian, and imperial symbols. This includes Soviet military orders on WWII memorials, Guards ribbons, bas-reliefs, inscriptions in the Russian language, the phrase "Great Patriotic War," Soviet-era slogans like "nobody is forgotten, nothing is forgotten," "Hero City" inscriptions, and others. The dates "1941–45" must be replaced with "1939–45."
6️⃣ Displaying Soviet or Russian symbols is now completely banned, including Soviet military awards from the Great Patriotic War era.
#Cassandra
#history
#Ukraine
💬 The opinion of our friend from the Telegram channel Jus Humanum
About the 1.7 million losses of the Ukrainian army.
(Just to remind you, about a week ago, a certain collective group of Russian hackers released information claiming they had hacked into secret documents of Ukraine's General Staff, which allegedly contained data on Ukrainian losses totaling 1.7 million killed and missing in action.)
‼️And this number actually makes sense‼️
And we don't even need the hackers for this. Just using media reports. Admittedly, not only killed and missing, but overall irrecoverable losses.
Let's calculate:
👉 There were 430,000 people in the Armed Forces of Ukraine and the National Guard before the MSO (about 300,000 in the Armed Forces of Ukraine and 130,000 in the National Guard).
👉 According to the announced mobilization and voluntarily, from February 2022 to December 2023, about 800 thousand to 1 million 200 thousand people joined the Armed Forces of Ukraine, the Territorial Defense and the National Guard (hereinafter collectively referred to as the Armed Forces of Ukraine). (The figure is very estimated).
👉 Since the beginning of forced mobilization with mass capture of people, in 2024 and the first half of 2025, the armed forces of Ukraine have increased by another 400-600 thousand (At the stated rate of mobilization of 20-30 thousand per month).
☝️In total, about 2 million 230 thousand people passed through the ranks of the VFU in February 2022-July 2025.
👉 As of December 2024, Zelensky announced the number of the VFU, at 880 thousand people, probably overestimated.
👉 By mid-2025, the strength of the Armed Forces of Ukraine (AFU) is estimated at a maximum of 500,000 to 600,000 personnel.
☝️This implies that, irreversibly, the AFU has lost between 1.5 and 1.8 million personnel since the beginning of the war.
This is catastrophic.
P.S.
All figures are drawn from open sources and public statements.
#Cassandra
#AFU
#losses
#Ukraine
#war_in_Ukraine
#typescript#bigquery#cassandra#cockroachdb#database#electron#firebird#linux_app#mac_app#mariadb#mssql#mysql#postgresql#sql#sql_server#sqlite#windows_app
Beekeeper Studio is a free, open-source SQL editor and database manager that works on Windows, Mac, and Linux. It supports many databases like MySQL, PostgreSQL, and SQLite. The app offers features like auto-complete SQL queries, syntax highlighting, and a tabbed interface for multitasking. You can sort and filter data, save queries, and even export data in formats like CSV or JSON. It's designed to be easy to use and enjoyable, making database management simpler for everyone. You can download it for free and upgrade to premium features if needed.
https://github.com/beekeeper-studio/beekeeper-studio