Python正则表达式-从CSS声明中获取所有值
我正在用Python编写一个简单的CSS解析器。现在我想从这个字符串中提取所有值:Python正则表达式-从CSS声明中获取所有值,python,css,regex,parsing,Python,Css,Regex,Parsing,我正在用Python编写一个简单的CSS解析器。现在我想从这个字符串中提取所有值:“1px实心rgb(255,255,255)”。现在我的模式(不工作)是:“\S+[^rgb]+”。当我将其与字符串“1px实心rgb(255,255,255)”一起使用时,我得到以下结果: ... >>> re.findall("\S+[^rgb]+", string) ("1px solid", "rgb(255, 255, 255)") 我希望它是 ("1px", "solid", "rg
“1px实心rgb(255,255,255)”
。现在我的模式(不工作)是:“\S+[^rgb]+”
。当我将其与字符串“1px实心rgb(255,255,255)”
一起使用时,我得到以下结果:
...
>>> re.findall("\S+[^rgb]+", string)
("1px solid", "rgb(255, 255, 255)")
我希望它是("1px", "solid", "rgb(255, 255, 255)")
p.S. 还有,有没有更好的方法来解析CSS声明?当前我的模式是“[\s]?(\s+[\s]?:[\s]?(.+)[\s]?;”。解析
“color:red;”
会给出:
("color", "red")
您可以尝试以下方法:
(\S+)[ ]+(?:(\S+)[ ]+)?(rgb\([^)]+\))
编辑:不管你想做什么,这可能不是正确的处理方法,因为CSS语法可能是不可预测的。您可以使用tinycss,Python CSS解析器来实现更理智的功能:
最后一次编辑
根据您的解决方案,您正在执行findAll,它将它们分别放入一个数组中。您只需要在其中输入一次rgb(),忽略空格。这应该适用于值模式,它比您现有的更干净。还要注意的是,您不希望在rgb()表达式中使用“.”。如果同一行上有rgb()1px rgb(),则默认情况下正则表达式是贪婪的…它将尽可能匹配。试试这个:r“(rgb([^)]+)|(\S+)”好。我希望它能工作。是最后的代码
编辑 在漫长而乏味地阅读手册之后,我终于让它正常工作了:
“rgb\([^)]*\)\S+”
我不确定它应该如何工作。它只是从文本中提取所有的(num,num,num)
。哦,我以为你指的是数值。您的示例字符串的“值”到底是什么意思?哦,对不起。是我的错。请检查我修改过的答案,我写了我真正需要的输出哦,我遇到了另一个问题。当我尝试将它与字符串一起使用时,“1px rgb(255,255,255)”
会给我一个空列表。不幸的是。如果我使用更多的参数(例如“1px solid blah rgb(255,255,255)”
),它会生成[“solid”,“blah”,“rgb(255,255,255)”]。#这里没有“1px”
。我不明白为什么要重复rgb()表达式,并在它们之前和之后使用它们。但是,对你来说,一次匹配一个令牌肯定更容易。出于好奇,我确实尝试了一种更灵活的表达方式,但我的努力失败了:@sdanzig,我重复了两次rgb,使它与其他文本前后的rgb(…)匹配(如“solid”,“1px”
)