Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.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_Css_Regex_Parsing - Fatal编程技术网

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

我正在用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", "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”