有一个名为python-slugify
的Python软件包,可以很好地将文本转换为slug格式:
pip install python-slugify
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")
请参阅更多示例
这个软件包比你发布的内容做了更多的事情(看一下源代码,它只有一个文件)。该项目仍然活跃(我最初回答时已更新2天,超过9年后(最后检查时间为2022-03-30),它仍在更新)。
注意:还有一个名为slugify
的第二个软件包。如果你两个都有,可能会出现问题,因为它们导入时具有相同的名称。只命名为slugify
的那一个没有做到我快速检查的所有事情:"Ich heiße"
变成了 "ich-heie"
(应该是 "ich-heisse"
),所以在使用pip
或easy_install
时,请确保选择正确的软件包。
python-slugify
是根据 MIT 许可证发布的,但它使用了根据 GPL 许可证发布的 Unidecode
库,因此可能不适合某些项目。 - Rotaretipython-slugify
现在默认采用艺术许可证的 text-unidecode
而非 GPL 许可证的 Unidecode
,以解决您的许可证问题。 https://github.com/un33k/python-slugify/commit/b8be7d69119dcceb9a3e0ce64a509415737190ac#diff-e4156a8bee1b298082516842836621b9 - Emilien从这里安装unidecode以支持Unicode。
pip install 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)
>>> my-custom-khello-vorld
slugify("My custom хелло ворлд")
替换为 slugify(u"My custom хелло ворлд")
,它应该可以工作了。 - kratenkostr
,因为这会隐藏内置的 str
类型。 - crodjer有一个名为awesome-slugify的Python包:
pip install awesome-slugify
操作方式如下:
from slugify import slugify
slugify('one kožušček') # one-kozuscek
slugify(text).lower()
。 - Kalob Tauliendef 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)
slug = unicodedata.normalize('NFKD', s)
这被称为Unicode标准化(Unicode normalization),它不会将许多字符分解为ASCII。例如,它将从以下字符串中剥离非ASCII字符:
Mørdag -> mrdag
Æther -> ther
import unidecode
slug = unidecode.unidecode(s)
对于上述字符串以及许多希腊和俄罗斯字符,您可以获得更好的结果:
Mørdag -> mordag
Æther -> aether
unicode-slugify
不再仅限于Django。awesome-slugify
是GPLv3,尽管作者在一个开放问题中表示他们更喜欢发布为MIT / BSD,只是不确定合法性:https://github.com/dimka665/awesome-slugify/issues/24
slug=re.sub(r'--+',r'-',slug)
由于模式[-]+
与-+
没有区别,而且您并不真正关心匹配一个连字符,只有两个或更多的情况。
但是,当然,这相当微小。