Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🍿 Titan: The OceanGate Disaster – The Titan Tragedy Uncovered
📆Release: June 11 on Netflix
🎭Genre: #Documentary · #TrueCrime
⬇️Follow Doc
This documentary pulls no punches. It lays bare the reckless decisions of OceanGate CEO Stockton Rush, whose obsession with turning Titanic dives into a tourist thrill ride ended in catastrophe. With never-before-seen footage, chilling audio, and damning testimonies, it reveals how clear warnings about the Titan sub’s instability were ignored. One quote hits like a hammer: ‘It was mathematically certain it would collapse.’
Directed by Mark Monroe (Fantastic Fungi), the film dives deep into a story of ego, negligence, and broken moral limits—nearly 12,500 feet below the surface. An unmissable watch that shows how ambition, unchecked, can lead to disaster. ⚠️🌊
Лекция «Копейский маньяк — история жизни и преступлений Вячеслава Яикова»
Хотите заглянуть в темные уголки криминальной истории и узнать, как работает настоящий судмедэксперт? Приглашаем на лекцию Алексея Решетуна — врача, судмедэксперта высшей категории, автора книг «Вскрытие покажет» и «Как не умереть молодым», участника расследования одного из самых известных серийных убийств начала 2000-х на Южном Урале.
Алексей погрузит вас в атмосферу настоящего расследования и расскажет о преступлениях Вячеслава Яикова, которые потрясли Копейск
Это редкая возможность увидеть криминологию «изнутри» и задать вопросы специалисту лично.
🔴Дата: 24 октября (пт) 19:00
🔴Цена: от 1500₽ / для клуба — от 1125 ₽
🔴Адрес: Сообщество ВСмысле (Санкт-Петербург, ул. Гороховая, 47, Пространство SENO, двор G47, 3 этаж)
Спикер: Алексей Решетун — врач, судмедэксперт высшей квалификационной категории, автор научно-популярных книг, победитель в литературном конкурсе среди медицинских работников «Здравомыслие-2020» Минздрава России, член Российского союза писателей.
Погрузитесь в реальное расследование и получите ответы на вопросы, которые обычно скрыты за закрытыми дверями.
#truecrime#расследования
🕵️ Мы слышали, что вы любите настоящие криминальные истории… Вот шанс услышать всё из первых уст!
Приглашаем на лекцию судмедэксперта Алексея Решетуна, который погрузит вас в атмосферу настоящего криминального расследования.
Вы могли слышать о спикере ранее — он является автором книг «Вскрытие покажет» и «Как не умереть молодым», участвовал в реальном расследовании и поимке настоящего серийного маньяка. На лекции Алексей Решетун расскажет о нашумевших преступлениях в южноуральском городе Копейске начала 2000-х, в том числе о серийном убийце Вячеславе Яикове, и поделится, как работают настоящие специалисты-судмедэксперты.
🔴Лекция «Копейский маньяк — история жизни и преступлений Вячеслава Яикова»
🔴Дата: 24 октября (пт) 19:00
🔴Цена: от 1500₽ / для клуба — от 1125 ₽
🔴Адрес: Сообщество ВСмысле (Санкт-Петербург, ул. Гороховая, 47, Пространство SENO, двор G47, 3 этаж)
Спикер: Алексей Решетун — врач, судмедэксперт высшей квалификационной категории, автор научно-популярных книг, победитель в литературном конкурсе среди медицинских работников «Здравомыслие-2020» Минздрава России, член Российского союза писателей.
Это уникальная возможность узнать детали расследования и задать вопросы эксперту лично
#truecrime#расследования
Литература true crime призвана показать, что жизнь придумывает жёсткие сюжеты почище любого писателя. Самые лучшие из книг собрала редакция ReadRate.
#трукрайм#литература#книги#truecrime#чтопочитать
Westley Allan Dodd was hanged on January 5, 1993, in Washington. He was found guilty of sexually assaulting and killing three young children. This was the first execution in the state since 1960. ⚖️☠️
[Source]
@googlefactss#WestleyAllanDodd#DeathPenalty#WashingtonState#TrueCrime
The Valentine Massacre happened on February 14, 1929, in Chicago. Seven gang members were shot and killed. It is believed Al Capone’s gang was involved, but no one was proven guilty. The case is still unsolved.
🔫🕵️♂️
⚠️Warning, the following links may contain graphic contents, watch at your own risk.⚠️
[Read more1]
[Read more2]
[Read more3]
@googlefactss
#History#Chicago#GangViolence#Prohibition#TrueCrime