Ich bin auf der Suche nach dem besten Weg, um einen String zu "slugifizieren", was "slug" ist , und meine aktuelle Lösung basiert auf diesem Rezept
Ich habe es ein wenig geändert zu:
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)
Hat jemand Probleme mit diesem Code? Es funktioniert gut, aber vielleicht fehlt mir etwas oder Sie kennen einen besseren Weg?
Antworten:
Es gibt ein Python-Paket mit dem Namen
python-slugify
, das ziemlich gute Arbeit beim Slugifizieren leistet:Funktioniert so:
Siehe Weitere Beispiele
Dieses Paket bietet etwas mehr als das, was Sie veröffentlicht haben (sehen Sie sich die Quelle an, es ist nur eine Datei). Das Projekt ist noch aktiv (wurde 2 Tage vor meiner ursprünglichen Antwort aktualisiert, über sieben Jahre später (zuletzt überprüft am 30.06.2020), es wird immer noch aktualisiert).
Vorsicht : Es gibt ein zweites Paket mit dem Namen
slugify
. Wenn Sie beide haben, tritt möglicherweise ein Problem auf, da sie für den Import denselben Namen haben. Der gerade genannteslugify
hat nicht alles getan, was ich schnell überprüft habe:"Ich heiße"
wurde"ich-heie"
(sollte sein"ich-heisse"
), also wählen Sie unbedingt den richtigen aus, wenn Siepip
oder verwendeneasy_install
.quelle
python-slugify
ist unter MIT lizenziert, verwendet jedochUnidecode
die unter GPL lizenzierte Lizenz, sodass sie möglicherweise nicht für einige Projekte geeignet ist.python-slugify
jetzt standardmäßig die Artistic License'dtext-unidecode
anstelle der GPL-LizenzUnidecode
, um Ihr Lizenzproblem zu lösen . github.com/un33k/python-slugify/commit/…Installieren Sie von hier aus das Unidecode-Formular für die Unicode-Unterstützung
quelle
slugify("My custom хелло ворлд")
durchslugify(u"My custom хелло ворлд")
, und es sollte funktionieren.str
. Dies verbirgt den eingebautenstr
Typ.Es gibt ein Python-Paket namens awesome-slugify :
Funktioniert so:
awesome-slugify Github-Seite
quelle
slugify(text).lower()
wenn Sie das wollen.Es funktioniert gut in Django , daher verstehe ich nicht, warum es keine gute Allzweck-Slugify-Funktion wäre.
Hast du irgendwelche Probleme damit?
quelle
from django.utils.text import slugify
Das Problem ist mit der ASCII-Normalisierungslinie:
Es wird als Unicode-Normalisierung bezeichnet, bei der nicht viele Zeichen in ASCII zerlegt werden. Beispielsweise würden Nicht-ASCII-Zeichen aus den folgenden Zeichenfolgen entfernt:
Ein besserer Weg, dies zu tun, ist die Verwendung des Unidecode- Moduls, das versucht, Zeichenfolgen in ASCII zu transliterieren. Wenn Sie also die obige Zeile durch Folgendes ersetzen:
Sie erhalten bessere Ergebnisse für die oben genannten Zeichenfolgen und auch für viele griechische und russische Zeichen:
quelle
Dies ist die Slugify-Funktion in django.utils.text. Dies sollte Ihrer Anforderung genügen.
quelle
Unidecode ist gut; Seien Sie jedoch vorsichtig: Unidecode ist GPL. Wenn diese Lizenz nicht passt, verwenden Sie diese
quelle
Einige Optionen auf GitHub:
Jedes unterstützt leicht unterschiedliche Parameter für seine API, daher müssen Sie durchsehen, um herauszufinden, was Sie bevorzugen.
Beachten Sie insbesondere die verschiedenen Optionen für den Umgang mit Nicht-ASCII-Zeichen. Pydanny hat einen sehr hilfreichen Blog-Beitrag geschrieben, in dem einige der Unterschiede beim Umgang mit Unicode in diesen Slugify-Bibliotheken dargestellt werden: http://www.pydanny.com/awesome-slugify-human-readable-url-slugs-from-any-string.html Dieser Blog-Beitrag ist etwas veraltet, weil Mozilla
unicode-slugify
nicht mehr Django-spezifisch ist.Beachten Sie auch, dass es sich derzeit
awesome-slugify
um GPLv3 handelt, obwohl es ein offenes Problem gibt, bei dem der Autor angibt, dass er es vorziehen würde, als MIT / BSD zu veröffentlichen, aber nicht sicher ist, ob dies legal ist: https://github.com/dimka665/awesome-slugify/issues/ 24quelle
Sie können die letzte Zeile in ändern
da das Muster
[-]+
nicht anders ist als-+
und es Ihnen nicht wirklich wichtig ist, nur einen Bindestrich, nur zwei oder mehr zu finden.Aber das ist natürlich ziemlich gering.
quelle
Eine andere Option ist
boltons.strutils.slugify
. Boltons hat noch einige andere nützliche Funktionen und wird unter einerBSD
Lizenz vertrieben.quelle