我正在寻找"slugify"字符串"slug"的最好方法,而我目前的解决方案是基于这个配方
我已经改变了一点:
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)
Run Code Online (Sandbox Code Playgroud)
有人看到这个代码有任何问题吗?它工作正常,但也许我错过了一些东西或者你知道更好的方法吗?
kra*_*nko 126
有一个名为python的软件包python-slugify,它可以很好地进行重击:
pip install python-slugify
Run Code Online (Sandbox Code Playgroud)
像这样工作:
from slugify import slugify
txt = "This is a test ---"
r = slugify(txt)
self.assertEquals(r, "this-is-a-test")
txt = "This -- is a ## test ---"
r = slugify(txt)
self.assertEquals(r, "this-is-a-test")
txt = 'C\'est déjà l\'été.'
r = slugify(txt)
self.assertEquals(r, "cest-deja-lete")
txt = 'Nín h?o. W? shì zh?ng guó rén'
r = slugify(txt)
self.assertEquals(r, "nin-hao-wo-shi-zhong-guo-ren")
txt = '?????????'
r = slugify(txt)
self.assertEquals(r, "kompiuter")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt)
self.assertEquals(r, "jaja-lol-mememeoo-a")
Run Code Online (Sandbox Code Playgroud)
查看更多示例
这个包比你发布的更多(看看源代码,它只是一个文件).该项目仍然有效(在我最初回答前两天更新,四年后(最后检查2017-04-26),它仍然得到更新).
小心:周围有第二个包裹,名为slugify.如果您同时拥有它们,则可能会出现问题,因为它们具有相同的导入名称.刚刚命名的那个slugify并没有做我所做的全部快速检查:"Ich heiße"成为"ich-heie"(应该"ich-heisse"),所以一定要选择正确的,当使用pip或时easy_install.
use*_*810 28
从这里安装unidecode表单以获得unicode支持
pip安装unidecode
# -*- coding: utf-8 -*-
import re
import unidecode
def slugify(text):
text = unidecode.unidecode(text).lower()
return re.sub(r'[\W_]+', '-', text)
text = u"My custom ????? ?????"
print slugify(text)
Run Code Online (Sandbox Code Playgroud)
>>> my-custom-khello-vorld
vor*_*nin 11
有一个名为awesome-slugify的 python包:
pip install awesome-slugify
Run Code Online (Sandbox Code Playgroud)
像这样工作:
from slugify import slugify
slugify('one kožuš?ek') # one-kozuscek
Run Code Online (Sandbox Code Playgroud)
问题在于ascii规范化线:
slug = unicodedata.normalize('NFKD', s)
Run Code Online (Sandbox Code Playgroud)
它被称为unicode规范化,它不会将许多字符分解为ascii.例如,它会从以下字符串中删除非ascii字符:
Mørdag -> mrdag
Æther -> ther
Run Code Online (Sandbox Code Playgroud)
更好的方法是使用试图将字符串音译为ascii 的unidecode模块.因此,如果您将以上行替换为:
import unidecode
slug = unidecode.unidecode(s)
Run Code Online (Sandbox Code Playgroud)
对于上述字符串以及许多希腊语和俄语字符,您可以获得更好的结果:
Mørdag -> mordag
Æther -> aether
Run Code Online (Sandbox Code Playgroud)
def slugify(value):
"""
Converts to lowercase, removes non-word characters (alphanumerics and
underscores) and converts spaces to hyphens. Also strips leading and
trailing whitespace.
"""
value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore').decode('ascii')
value = re.sub('[^\w\s-]', '', value).strip().lower()
return mark_safe(re.sub('[-\s]+', '-', value))
slugify = allow_lazy(slugify, six.text_type)
Run Code Online (Sandbox Code Playgroud)
这是django.utils.text中出现的slugify函数.这应该满足您的要求.
| 归档时间: |
|
| 查看次数: |
57061 次 |
| 最近记录: |