Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
„Der Sommer wird enden“ - Drama mit dem oskarnominierten Schauspieler Yury Borisov
Der Film erzählt die Geschichte von Kescha, einem 27-jährigen Mann, der nach Verbüßung einer Haftstrafe in sein Heimatdorf in Jakutien zurückkehrt, um einen Neuanfang zu wagen. Zunächst scheint alles möglich: Seine Familie steht hinter ihm, er findet Arbeit in einer Goldabbau-Kooperative, und sein jüngerer Bruder Tima bereitet sich auf die Aufnahme an einer Universität vor.
Doch die Hoffnung auf ein ruhiges Leben zerbricht, als Kescha an seinem neuen Arbeitsplatz betrogen wird. In dem Versuch, sich zu rächen und zugleich zu überleben, trifft er gemeinsam mit seinem Bruder eine folgenschwere Entscheidung: Sie stehlen Gold. Bald befinden sich die beiden auf der Flucht, verfolgt von ihren Gegnern, und müssen einen Ausweg aus einer immer bedrohlicheren Situation finden.
Die Filmvorführung findet am 3. März um 19:00 statt.
18+
Meldet euch rechtzeitig an!
#Kino#RussischesKino#KinoinBerlin#Film
„Der Sommer wird enden“ - Drama mit dem oskarnominierten Schauspieler Yury Borisov
Der Film erzählt die Geschichte von Kescha, einem 27-jährigen Mann, der nach Verbüßung einer Haftstrafe in sein Heimatdorf in Jakutien zurückkehrt, um einen Neuanfang zu wagen. Zunächst scheint alles möglich: Seine Familie steht hinter ihm, er findet Arbeit in einer Goldabbau-Kooperative, und sein jüngerer Bruder Tima bereitet sich auf die Aufnahme an einer Universität vor.
Doch die Hoffnung auf ein ruhiges Leben zerbricht, als Kescha an seinem neuen Arbeitsplatz betrogen wird. In dem Versuch, sich zu rächen und zugleich zu überleben, trifft er gemeinsam mit seinem Bruder eine folgenschwere Entscheidung: Sie stehlen Gold. Bald befinden sich die beiden auf der Flucht, verfolgt von ihren Gegnern, und müssen einen Ausweg aus einer immer bedrohlicheren Situation finden.
Die Filmvorführung findet am 3. März um 19:00 statt.
18+
Meldet euch rechtzeitig an!
#Kino#RussischesKino#KinoinBerlin#Film
„Ewiger Winter“ - Drama in russischer Sprache mit englischen Untertiteln
Die Geschichte konzentriert sich auf die Familie von Wladimir und Elena, deren Leben nach dem tragischen Tod ihres Sohnes aus den Fugen gerät. Die Mutter versucht, ihren Sohn über sein Tagebuch besser zu verstehen und zugleich einen Zugang zu den eigenen Gefühlen zu finden. Der Vater hingegen wird von dem Wunsch besessen, die Schuldigen aufzuspüren und zu bestrafen, was ihn zum Gefangenen seines eigenen Schmerzes und Zorns macht.
Der Film zeigt, wie Trauer, Schuld, Verzweiflung und das Bedürfnis nach Gerechtigkeit unterschiedlich auf Menschen wirken und wie schwer es ist, nach einem Verlust einen Weg zu Akzeptanz und zur Wiederannäherung zu finden.
Die Filmvorführung findet am 26. Februar um 19:00 Uhr statt.
FSK: 18+
Meldet euch rechtzeitig an!
#Kino#RussischeFilm#KinoinBerlin#EwigerWinter#DramaFilm
"Peter der Große: Der letzte Zar und der erste Kaiser" – der beliebte historische Film🎞️ wird in russischer Sprache mit englischen Untertiteln am 1. Oktober um 19:00 Uhr im Filmtheater im Russischen Haus in Berlin gezeigt!
• Wie bestieg Peter der Große den Thron, obwohl er das vierzehnte Kind in seiner Familie war?👑
• Wie gelang es ihm, den Zugang zum Meer zurückzugewinnen, obwohl das Land keine professionelle Armee und Marine hatte?🪖
• Wie schaffte er es, Russland innerhalb weniger Jahrzehnte an die Weltspitze zu führen, obwohl das Land zuvor kaum ernst genommen wurde?🤔
Ihr habt eine tolle Chance, diese dokumentarische Rekonstruktion auf einer großen Leinwand📺 anzuschauen: kommt unbedingt vorbei und erfahrt mehr über die wichtigen Momente in der Geschichte Russlands!😍🍿
🎟️ Eintritt frei
#doku#historischerfilm#geschichte#kinoinberlin#russischeshausberlin#peterdergroße#russischerzar#gratisevent#russischeskino