Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
📣📣📣Speaking contest 📣📣
#Actual speaking topic
.All answers should be sent to @I_ENG_LISH
⭕ Describe an interesting talk or speech you heard recently
⚠️You should say
🍀Where you heard it
☘️Who the speaker was
🍀What the talk or speech was about
☘️Why you think it was interesting
“Khamenei Will Die Soon”
The Khamenei regime will not be able to maintain control over Iranian society after the violent suppression of the latest wave of protests, one of the country’s leading film-makers has predicted.
“It is impossible for this government to sustain itself in this situation (...) Khamenei will die soon”, the director Jafar Panahi said.
“They know it too. They know that it will be impossible to rule over people. Perhaps their only goal right now is to bring the country to the verge of complete collapse and try to destroy it.”
Protests caused by an ailing economy have swept through Iran since late December and were met with deadly crackdowns by the security forces over the weekend, with reports of more than 2,500 people killed.
A internet blackout imposed last Friday, which blocked 95-99% of the country’s communication network, was a “sign that there would be a very big massacre on the way”, Panahi said.
“But we never predicted that the crackdown would have such dimensions and numbers.”
In December the director was handed a one-year prison sentence in absentia on charges of creating propaganda against the political system, but he has stated his intention to return to the country.
He has been jailed twice, for protesting against the detention of two fellow film-makers who had been critical of the authorities in 2022, and for supporting anti-government protests in 2010.
Panahi said while the collapse of the government led by the clerical leader, Ayatollah Ali Khamenei, was inevitable after the latest bloody suppressions, its timing was impossible to predict.
He warned western governments about engaging with the clerical regime as rational actors.
“In other dictatorships around the world, you will see that there will be at least a few people who will act based on rationality and who will not let it get to this point,” he said, speaking via his interpreter Sheida Dayani.
“But unfortunately in this system there is no rationality. All they can think of is crackdown and how they can stay in power even just one more day. The last thing they’re thinking about is the people.”
Asked whether Pahlavi could be trusted to oversee a post-regime transition, he said this would be for the people of Iran to conclude.
“Whether we agree with Pahlavi or not, we know that the overwhelming majority of the population of Iran want the current regime to go.”
#khamenei#iran#regime#actual#people#killed
📱American Оbserver - Stay up to date on all important events
🇺🇸