Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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 majority of young Americans want to leave the country, a new report from the American Psychological Association showed that 63% of Americans between the ages of 18 and 34 were thinking about emigrating. 🌍
There are 53% of such parents. In the whole country, anxiety is even higher: 76% of adults admitted that they are worried about the state of the country — political division, instability and a sense of uncertainty about the future. Many of the respondents feel isolated and tired. 😟
People who are particularly hard—pressed by the division in the country are more likely to complain of anxiety and health problems - they have higher levels of chronic diseases and fatigue. 🩺
People with high levels of loneliness are more likely to cancel appointments, sleep poorly, and stop taking care of themselves. 🛌
69% of Americans are worried about fakes, 57% are worried about the growing influence of AI, especially young people and parents. 🤖
But 84% are confident that they will be able to build a good life, and 73% believe that they can change the country's future for the better. 💪
#Youth#Poll
👂More on Trump's Ear
President Donald Trump's administration is now aiming to make the voting process harder for college-age young adults ahead of November's midterm elections.
That's according to a Monday op-ed by MS NOW's Ja'han Jones, who wrote that the Trump administration's Department of Education may be exploring a way to curb young voter turnout with a newly announced investigation into Tufts University. The Education Department announced its new probe in a recent press release, saying the Boston, Massachusetts-based school may have been "illegally sharing college students’ data with third parties to influence elections."
The investigation is centered on Tufts' National Study of Learning, Voting, and Engagement (NSLVE). Tufts describes the NSLVE as "a service to over 1,000 U.S. colleges and universities that can use it to understand and improve their student voting rates." However, the Trump administration is saying the program could have potentially violated the Family Educational Rights and Privacy Act.
"American colleges and universities should be focused on teaching, learning, and research — not influencing elections," Education Secretary Linda McMahon stated. "The Biden Administration, with little to no regard for student privacy laws, openly encouraged institutions to share and utilize student data in order to target certain populations."
#Trump#Elections#Youth
👂More on Trump's Ear ⚠️
🌍 More than 40% of the world's population is under age 25—a record share of young people. This youth wave is largest in Africa and South Asia, shaping future trends worldwide. ✨
#demography⚡#youth⚡#geography⚡#nature⚡#earth
👉subscribe Amazing Geography
👉more Channels
🌐 Organized by youth, for youth: the World Bank Group #Youth Summit is back!
💡 The 11th edition of the World Bank Group Youth Summit is on the theme of Digital Transformation and will engage thousands of participants from around the world.
🧭 The Summit is the largest worldwide annual gathering of youth (aged 18-35) hosted by the World Bank Group.
✅ This year's theme, Powering Progress: Youth Leading the Digital Transformation, will focus on three subthemes: Digital Access and Inclusion, Artificial Intelligence, and Sustainable Technology for a Livable Planet.
📲 Join the event online or in person on May 30-31 in Washington DC.
📝 Seats are limited, so APPLY NOW! Applications are reviewed on a rolling basis, and the deadline is April 25th, 2024.
ℹ️ For more information, please consult the Summit's website or email [email protected].
🗣️ Don't miss out on this opportunity to engage with your peers on the most pressing topics facing our generation!
🔎http://wrld.bg/LxEs50QTffx
#WBGYouthSummit