3

我正在用 Python 开发一个简单的 CSS 解析器。现在我想从这个字符串中提取所有值:"1px solid rgb(255, 255, 255)". 现在我的模式(不起作用)是:"\S+[^rgb]+". 当我将它与 string 一起使用时"1px solid rgb(255, 255, 255)",我得到以下信息:

...
>>> re.findall("\S+[^rgb]+", string)
("1px solid", "rgb(255, 255, 255)")

我希望它是

("1px", "solid", "rgb(255, 255, 255)")

PS 另外,有没有更好的方法来解析 CSS 声明?目前我的模式是"[\s]?(\S+)[\s]?:[\s]?(.+)[\s]?;". 解析"color: red;"给了我:

("color", "red")
4

2 回答 2

2

你可以试试这个:

(\S+)[ ]+(?:(\S+)[ ]+)?(rgb\([^)]+\))

http://regex101.com/r/vA4kH1

编辑:无论你想做什么,这可能不是处理它的正确方法,因为 CSS 语法可能是不可预测的。你可以使用 tinycss,Python CSS 解析器来做一些更理智的事情:

http://pythonhosted.org/tinycss/

最后一个编辑...

根据您的解决方案,您正在执行 findAll,它将它们分别放在一个数组中。您只需要 rgb() 一次,忽略空间。这应该适用于价值模式,它比你所拥有的更干净。另请注意,您不想使用“。” 对于您的 rgb() 表达式。如果您在同一行上有 rgb() 1px rgb() ,则正则表达式默认是贪婪的......它会尽可能匹配。试试这个:r"(rgb([^)]+))|(\S+))"

于 2013-10-25T21:03:21.937 回答
1

好的。我让它工作(我希望)。是最终的代码。


编辑

经过漫长而无聊的手册阅读后,我终于让它正常工作: "rgb\([^)]*\)|\S+"

于 2013-10-25T21:58:05.517 回答