Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python从任意字符串创建CSS标识符?_Python_Regex_Django - Fatal编程技术网

如何使用python从任意字符串创建CSS标识符?

如何使用python从任意字符串创建CSS标识符?,python,regex,django,Python,Regex,Django,在处理Django模板标记时,我发现自己需要获取一个字符串并将其转换为CSS标识符,这样它就可以成为html元素的class属性的一部分。问题是字符串可能包含空格,这使得它无法用作CSS标识符,而且还可能包含标点符号 我的想法是用正则表达式把好的部分去掉,然后再重新组合起来,但我不知道如何表达重复的组模式。这是我的 to_css = re.compile(r"[^a-z_-]*([a-z0-9_-]+[^a-z0-9_]*)+", re.IGNORECASE) @register.filter(

在处理Django模板标记时,我发现自己需要获取一个字符串并将其转换为CSS标识符,这样它就可以成为html元素的class属性的一部分。问题是字符串可能包含空格,这使得它无法用作CSS标识符,而且还可能包含标点符号

我的想法是用正则表达式把好的部分去掉,然后再重新组合起来,但我不知道如何表达重复的组模式。这是我的

to_css = re.compile(r"[^a-z_-]*([a-z0-9_-]+[^a-z0-9_]*)+", re.IGNORECASE)
@register.filter(name='as_css_class')
def as_css_class(value):
    matches = to_css.match(value)
    if matches:
        return '-'.join(matches.groups())
    return ""
这样做会带来问题:

as_css_class("Something with a space in it")
你得到了什么

'it'

我希望+可以应用于(组),但显然它没有实现我想要的功能。

它需要是CSS类吗

<div data-something="Anything you like provided it's HTML escaped"> ... </div>
可以说,您不应该在类中添加任意数据,因为您可能会与现有类发生冲突。数据属性允许您指定具有名称冲突的信息。

您可以使用:

from django.template.defaultfilters import slugify
slugify("Something with a space in it")

您的正则表达式将匹配整个字符串,捕获的唯一组是“it”(因此是结果)。捕获组将只保留它捕获的最后一个字符串。一个正则表达式不能捕获任意数量的字符串

但是,您可以做的是使用全局修饰符
g
(或者简单地使用Python中的
re.findall
)。比如:

re.findall(r'[\w-]+');

然后加入结果(或多或少,我的Python有点生锈)。

Python无法多次匹配同一组是的,它在class=“string here”中运行。这一个的优点是不需要我编写任何代码,只存在前导数字和前导连字符后跟数字的问题。