2014-11-23 83 views
0

我一直在尝试做一些正则表达式的CSS文件来提取某些属性,但我遇到了匹配从{到第一个;等..这里是我到目前为止已经取得的成就:正则表达式匹配CSS

范例CSS:

.pancake{height:200px;taste:delicious;} 

我设法写这两个小刺的工作:

这一个从得到的一切点到{:

(^\.[a-z]+) 

这一个得到之间{}的一切:

{.+} 

我试着读了一些正则表达式,但不明白如何搭配不止一次发生或更多的比赛,直到另一场比赛中的某些字符(副匹配)

+0

如果你试图解析以任何方式CSS(获得一定的属性出来的文字),我不会使用正则表达式*,而是令牌化字符串建议*。 – Jon 2014-11-23 01:33:51

+0

这是又一步! 谢谢你的提醒:) 但我现在真正想要做的是选择正确的数据。 – Onilol 2014-11-23 01:39:13

+0

你只想匹配班煎饼及其描述? – 2014-11-23 01:44:00

回答

1

,如果你想尝试regex.See演示试试这个。

http://regex101.com/r/yP3iB0/1

import re 
p = re.compile(ur'\b(\w+):(\w+)(?=;)') 
test_str = u".pancake{height:200px;taste:delicious;}" 

re.findall(p, test_str) 
+0

这正是我所需要的。我只是改变了两件事,但你给了我需要的帮助。 '\ b(\ w + \:)(\ w + \;)' – Onilol 2014-11-23 13:54:29

3

正如乔恩说,使用正则表达式是解析CSS文件可能不是一个好主意。 CSS语法提供了很多你可能不想亲自处理的角落案例。我建议你看看tinycss,一个不错的CSS解析库。

您可以使用它像这样:

import tinycss as tcss 

stylesheet = ".pancake{height:200px;taste:delicious;}" 
parser = tcss.make_parser() 
parsed = parser.parse_stylesheet(stylesheet) 

for rule in parsed.rules: 
    print "".join(t.as_css() for t in rule.selector) 
    for declaration in rule.declarations: 
     print "\t{0}: {1}".format(declaration.name, declaration.value.as_css()) 
+0

感谢您帮助我进行这项教学研究。我承认使用一种图书馆可以明确地加快我的最终目标,但现在我正在努力学习它。不过谢谢!你的回答很有帮助:) – Onilol 2014-11-23 13:53:50

+0

昨天我发现了这个图书馆,非常好。但是,这取决于CSS的质量。例如,我们在定义颜色方面非常不一致,因此有时我们使用#eee,有时使用“whitesmoke”,有时使用#eeeeee。所以我可以使用tinycss(实际上我现在是),但是我必须标准化我的CSS颜色,或者我仍然需要一个正则表达式来匹配样式字符串中的颜色。如果这是有道理的。 – 2016-07-15 13:02:45