Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
Cuando los dirigentes de #España descubren que hacen frontera con #Argelia, no es inocente
https://elpais.com/espana/2024-02-13/gas-exportaciones-y-migracion-espana-y-argelia-una-relacion-mucho-mas-alla-de-la-vecindad.html
#Argelia veta la entrada de mercancías que hayan pasado por puertos de #Marruecos
https://www.europapress.es/nacional/noticia-argelia-escala-pulso-economico-marruecos-veta-entrada-mercancia-pase-puertos-marroquies-20240118130931.html
Después de levantar parcialmente el bloqueo a las exportaciones desde #España
https://www.elindependiente.com/internacional/2024/01/15/argelia-levanta-parcialmente-el-bloqueo-a-las-exportaciones-desde-espana/
#Marruecos sigue preparándose para la #guerra con #Argelia
https://www.zona-militar.com/2024/01/21/marruecos-comprara-a-turquia-200-vehiculos-blindados-4x4-cobra-ii-para-sus-fuerzas-armadas/
#Francia#España. #Automoción. Stellantis se lleva la nueva producción a #Marruecos y #Argelia
https://www.farodevigo.es/economia/2023/11/05/stellantis-invierte-650-millones-ano-94215378.html
🌍✈️🇷🇺 Varios países piden los cazas rusos de quinta generación Su-57E
En víspera de la feria de defensa DSA-2026, que se celebrará en Malasia, la exportadora de armamento estatal rusa “Rosboronexport” confirmó que varios países firmaron contratos para comprar el caza ruso Su-57E (el índice de la versión de exportación).
🗣 “El Su-57E suscita un gran interés entre los socios de Rosoboronexport, varios de los cuales ya han contratado el caza ruso. La lista de clientes para este avión se está ampliando con confianza”, declararon en la empresa.
Cabe señalar, que en las últimas semanas básicamente se ha confirmado que Argelia se ha convertido en el primer operador extranjero del caza ruso de quinta generación, con imágenes de las primeras máquinas ya surcando los cielos de este país africano.
En este contexto, no podemos no compartir con ustedes algunas de las fotos más recientes, en las que se puede apreciar la librea de estas máquinas.
Al mismo tiempo, en Rosoboronexport insinuaron que Malasia podría ser uno de los nuevos compradores de estos cazas, al mencionar que “el Su-57E es una opción genial para la modernización y desarrollo de la Real Fuerza Aérea, especialmente considerando el hecho de que comparte algunos sistemas con los Su-30MKM ya operados por esta nación asiática”.
#Arsenal#Su57
#Rusia#Argelia#Malasia
Entérate y comparte @ATodaPotencia🚀
#Francia#Qatar, el #gas y los intereses cruzados con #Italia y #Argelia en el Mediterráneo
https://www.eleconomista.es/energia/noticias/12494744/10/23/francia-blinda-su-gas-natural-con-qatar-y-perfila-un-nuevo-hub-energetico-en-el-mediterraneo.html
#Argelia lista para recibir a #Hamas como un día hizo con la #OLP y #Fatah
https://www.marianne.net/monde/proche-orient/israel-palestine-lalgerie-prete-a-accueillir-le-hamas-avec-l-aide-de-la-france-pas-si-sur
#Argelia esquiva a España con el #SoutH2, el corredor que llevará #hidrógeno verde y #gas a #Alemania pasando por #Italia
https://www.eleconomista.es/energia/noticias/12508312/10/23/argelia-esquiva-a-espana-con-el-south2-el-corredor-que-llevara-hidrogeno-verde-y-gas-a-alemania.html
#España y #Marruecos en un bonito alineamiento imperialista contra #Argelia por el #gas de #Niger que aumentará las tensiones bélicas en todo el Occidente de #África
https://www.eleconomista.es/energia/noticias/12527895/11/23/el-plan-de-marruecos-en-la-pugna-con-argelia-por-el-gas-nigeriano-pasa-por-espana.html
#EEUU. Buscando como contar en positivo las supuestas ventajas de la ruptura del mercado mundial y las ineficiencias brutales de la #DivisiónInternacionaldelTrabajo surgida de la #guerracomercial y la #guerratecnológica. #Clave
«Los últimos cinco años, que han estado caracterizados por una pandemia, la guerra en Ucrania y las secuelas de ambas, señalan el fin de una economía que se basaba en todo barato: dinero barato, energía barata y mano de obra barata. Todo eso se va o se va. Se acabó una década y media de especulaciones sobre go-go. La era de lo barato está kaput.»
El cinismo es acongojante
«Un costo de capital más alto será doloroso temporalmente, pero dará a los mercados lo que han necesitado durante años: una razón para que los inversores separe las inversiones riesgosas (como algunas acciones de tecnología de consumo y memes) de otras más seguras (las industrias beneficiarse de un auge manufacturero)»
(Porque no va de succionar capital del resto del mundo, no.... que se lo digan a los #paísesemicoloniales y la #UE)
«La energía barata también se acabó. Un resultado de la invasión rusa de Ucrania es la comprensión (especialmente en Europa) de que obtener productos básicos cruciales de los autócratas nunca es una buena idea.»
(Porque #Azerbaiyán o #Turkmenistán o #Argelia o #Venezuela son estados inclusivos y super amables, obviamente)
«Finalmente, la era de la mano de obra barata ha terminado. Los salarios están aumentando y hemos visto más actividad laboral , incluidas huelgas, este año que en las últimas cuatro décadas. Seguirán más. Esta es una respuesta apropiada a décadas de estancamiento salarial en medio de ganancias corporativas récord. »
Porque los #salarios aumentan, claro... que lo hagan menos que la #inflación debe ser un detalle sin importancia
https://www.washingtonpost.com/opinions/2023/10/23/energy-money-cheap-era-ending/