Estou em busca da melhor maneira de "slugify" string o que é "slug" , e minha solução atual é baseada nesta receita
Eu mudei um pouco para:
s = 'String to slugify'
slug = unicodedata.normalize('NFKD', s)
slug = slug.encode('ascii', 'ignore').lower()
slug = re.sub(r'[^a-z0-9]+', '-', slug).strip('-')
slug = re.sub(r'[-]+', '-', slug)
Alguém viu algum problema com este código? Está funcionando bem, mas talvez eu esteja faltando alguma coisa ou você conhece uma maneira melhor?
Respostas:
Existe um pacote python chamado
python-slugify
, que faz um bom trabalho de slugifying:Funciona assim:
Veja mais exemplos
Este pacote faz um pouco mais do que o que você postou (dê uma olhada no código-fonte, é apenas um arquivo). O projeto ainda está ativo (foi atualizado 2 dias antes de eu responder originalmente, mais de sete anos depois (verificado pela última vez em 2020-06-30), ele ainda é atualizado).
cuidado : existe um segundo pacote, chamado
slugify
. Se você tiver os dois, poderá ter um problema, pois eles têm o mesmo nome para importação. O que acabou de ser nomeadoslugify
não fez tudo o que eu verifiquei rapidamente:"Ich heiße"
tornou - se"ich-heie"
(deveria ser"ich-heisse"
), portanto, certifique-se de escolher o certo ao usarpip
oueasy_install
.fonte
python-slugify
é licenciado pelo MIT, mas usa oUnidecode
que é licenciado pela GPL, portanto, pode não ser adequado para alguns projetos.python-slugify
agora usa a Licença Artística emtext-unidecode
vez da licença GPLUnidecode
, abordando sua preocupação com o licenciamento. github.com/un33k/python-slugify/commit/…Instale o formulário unidecode aqui para suporte Unicode
fonte
slugify("My custom хелло ворлд")
porslugify(u"My custom хелло ворлд")
e deve funcionar.str
. Isso oculta ostr
tipo embutido .Existe um pacote python chamado awesome-slugify :
Funciona assim:
página github incrível-slugify
fonte
slugify(text).lower()
se quiser.Funciona bem no Django , então não vejo por que não seria uma boa função slugify de propósito geral.
Você está tendo problemas com isso?
fonte
from django.utils.text import slugify
O problema é com a linha de normalização ASCII:
É chamado de normalização Unicode, que não decompõe muitos caracteres em ascii. Por exemplo, retiraria caracteres não ascii das seguintes strings:
A melhor maneira de fazer isso é usar o módulo unidecode que tenta transliterar strings para ascii. Portanto, se você substituir a linha acima por:
Você obtém melhores resultados para as strings acima e também para muitos caracteres gregos e russos:
fonte
Esta é a função slugify presente em django.utils.text. Deve ser suficiente para seus requisitos.
fonte
O unidecode é bom; no entanto, tenha cuidado: o unidecode é GPL. Se esta licença não se adequar, use esta
fonte
Algumas opções no GitHub:
Cada um oferece suporte a parâmetros ligeiramente diferentes para sua API, então você precisará dar uma olhada para descobrir o que prefere.
Em particular, preste atenção às diferentes opções que eles fornecem para lidar com caracteres não ASCII. Pydanny escreveu uma postagem de blog muito útil ilustrando algumas das diferenças de manipulação de Unicode nessas bibliotecas de slugify: http://www.pydanny.com/awesome-slugify-human-readable-url-slugs-from-any-string.html Esta postagem do blog está um pouco desatualizada porque o Mozilla
unicode-slugify
não é mais específico do Django.Observe também que atualmente
awesome-slugify
é GPLv3, embora haja um problema aberto em que o autor diz que prefere lançar como MIT / BSD, mas não tem certeza da legalidade: https://github.com/dimka665/awesome-slugify/issues/ 24fonte
Você pode considerar alterar a última linha para
já que o padrão
[-]+
não é diferente de-+
, e você realmente não se preocupa em combinar apenas um hífen, apenas dois ou mais.Mas, é claro, isso é muito pequeno.
fonte
Outra opção é
boltons.strutils.slugify
. Boltons também tem algumas outras funções úteis e é distribuído sobBSD
licença.fonte