Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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 way the United States has dealt with its ally, the #SDF, in #Syria is a wake-up call for all countries that believe they are strategic allies of the United States."
https://x.com/Mr_Salarosh/status/2015329233464447232
N.E #Syria : Field developments indicate that al-Jolani terrorist regime is not adhering to the declared ceasefire, despite the #SDF confirming its commitment to it.
Updates from the #SDF:
📌8:40 PM (Damascus time):
The town of Zarkan has been under heavy artillery shelling by Damascus factions for about half an hour, coinciding with Turkish drones flying over the area. Damage and casualty figures are still being assessed.
📌9:20 PM (Damascus time):
Damascus factions launched an attack using heavy weapons on the village of Tal Baroud, located on the Tal Abyad–Hasakah road, south of Hasakah.
Pres della Rep di #Turchia: "L'accordo tra le #SDF e il governo centrale servirà a garantire più sicurezza in #Siria. Riteniamo che ogni sforzo per liberare la Siria dal terrorismo sia un passo nella giusta direzione".
In #Siria sono ancora in corso gli scontri tra le Forze Democratiche Siriane, #SDF e le bande jihadiste sostenute dalla #Turchia. Riferiscono le SDF: "Uccisi 365 jihadisti, morti 81 nostri militanti, uccisi 47 civili tra cui 2 giornalisti".
Al-Hol Camp: Pro-alJolani media outlets have launched a campaign promoting the narrative that #ISIS detainees in al-Hol camp are "victims."
Since yesterday, pro–alJolani media have been conducting interviews with ISIS detainees in al-Hol camp, highlighting their claimed "suffering" and portraying them as having been wronged by the Syrian Democratic Forces (#SDF).
These interviews reveal that the camp houses men as well, contradicting the commonly promoted claim that it contains only women and children.
This style of coverage raises serious questions and suggests preparations to justify the release of some detainees, while ignoring their responsibility for some of the most brutal terrorist crimes in modern history, crimes rivaled only by those committed by Abu Mohammad al-Jolani himself.
Previously, a member of al-Jolani's government, Nour al-Din al-Baba, admitted that the perpetrators of the June 2025 suicide bombing targeting the Mar Elias Church in Damascus had come from al-Hol camp, exploiting the chaos following the fall of the former regime to escape the camp and reach Damascus. This raises the question: why is al-Jolani’s media now attempting to whitewash their image?
At the end of one circulating video showing al-Jolani's militias smuggling residents out of al-Hol camp, a child is heard asking one of the militants: “Do you have weapons?”, underscoring that this is a dangerous extremist group posing a serious threat to Syrian society and beyond.
Additionally, Saudi channel Al-Hadath aired footage from the camp showing an angry ISIS detainee demanding that the Syrian state hold UNHCR staff accountable.
#MazloumAbdi, comandante generale delle Forze Democratiche Siriane, #SDF; "Da due mesi siamo in contatto diretto con la #Turchia. Posso incontrare di persona il Presidente della Repubblica di Turchia".
#MazloumAbdi, comandante generale delle Forze Democratiche Siriane, #SDF: "Il Presidente della Repubblica deve identificare i responsabili del pogrom in corso contro gli aleviti. Sono coinvolte le formazioni paramilitari sostenute dalla #Turchia".
#Aleppo: Footage reveals the aftermath of shelling by alJolani-led/ #HTS-led regime forces targeting the Sheikh Maqsoud neighborhood in Aleppo.
Several shells also landed in the adjacent Al-Midan neighborhood due to indiscriminate attacks on residential areas.
Local media and the Saudi channel "Al-Hadath" falsely claimed that the shelling was carried out by the #SDF, despite footage clearly showing regime forces themselves using all types of artillery.
It should be emphasized that the SDF has no presence in Aleppo, having withdrawn all heavy weapons and personnel under the March 10 agreement. The only forces remaining in Sheikh Maqsoud and Al-Ashrafiyah are the Asayish units, which serve solely as internal security.
#MazloumAbdi, il comandante delle Forze Democratiche Siriane, #SDF e il Presidente della Repubblica di #Siria hanno trovato un accordo per l'integrazione all'esercito siriano.
#MazloumAbdi, comandante delle #SDF: “In #Siria ci sarà un cambiamento di base, non centralizzato. Tutti i popoli avranno un ruolo. Siamo in contatto diretto con la #Turchia e crediamo che possa contribuire positivamente.”
Oggi #Jolani in #Turchia, prima di partire: "Le Forze Democratiche Siriane, #SDF, accettano di aderire all'esercito ma ci sono dei disaccordi ancora da sistemare".