我正在编写一个python脚本来遍历CSS文件目录并保存包含特定格式的javadoc样式注释的任何内容。
评论/ CSS如下所示:
/**thirdpartycss
* @description Used for fixing stuff
*/
.class_one {
margin: 10px;
}
#id_two {
padding: 2px;
}
获取文件的全部内容的正则表达式如下所示:
pattern = "/\*\*thirdpartycss(.*?)}$"
matches = re.findall(pattern, css, flags=re.MULTILINE | re.DOTALL)
这给了我文件内容。我现在要做的是编写一个正则表达式来获取类中的每个CSS定义。这就是我试过的:
rule_pattern = "(.*){(.*)}?"
rules = re.findall(rule_pattern, matches[0], flags=re.MULTILINE | re.DOTALL)
我基本上试图找到任何文本,然后是开头{,任何文本,然后是结束} - 我想要一个所有CSS类的列表,本质上,但这只是在一个块中返回整个字符串。
有人能指出我正确的方向吗?
感谢。 马特
答案 0 :(得分:2)
{(.*)}
是贪婪匹配 - 它将从第一个{
到最后一个}
匹配,从而吞噬任何{
/ }
对可能在那些内部。你想要非贪婪的匹配,即
{(.*?)}
差异是星号后面的问号,使其不贪婪。
如果您需要正确匹配“嵌套”大括号,这仍然无效 - 但是,RE世界中的无会:在常规语言中有许多众所周知的限制(常规语言是那些正则表达式可以匹配的是“正确嵌套”任何类型的开/关括号是不可能的(一些令人难以置信的扩展所谓的RE管理,但不是Python的,任何有CS背景的人都会发现调用那些表达式“无论如何经常“冒犯;-)。如果您需要比RE所能提供的更一般的解析,pyparsing或其他成熟的Python解析器是正确的方法。
答案 1 :(得分:1)
@Alex is right(他不是吗?但我离题了)。如果您需要比正则表达式提供的更具体的解析,最好使用自定义解析器。幸运的是,你不必重新发明(CSS解析)轮。已有解决方案。
一段时间后我遇到了类似的要求。 cssutils模块在当时派上用场。我刚刚刷新了我的cssutils fu来为你准备这段代码:
In [16]: import cssutils
In [17]: s = """/**thirdpartycss
* @description Used for fixing stuff
*/
.class_one {
margin: 10px;
}
#id_two {
padding: 2px;
}"""
In [26]: sheet = cssutils.parseString(s)
In [27]: sheet.cssRules
Out[27]:
[cssutils.css.CSSComment(cssText=u'/**thirdpartycss\n* @description Used for fixing stuff\n*/'),
cssutils.css.CSSStyleRule(selectorText=u'.class_one', style=u'margin: 10px'),
cssutils.css.CSSStyleRule(selectorText=u'#id_two', style=u'padding: 2px')]
In [28]: sheet.cssRules[0].cssText
Out[28]: u'/**thirdpartycss\n* @description Used for fixing stuff\n*/'
In [29]: print sheet.cssRules[0].cssText
-------> print(sheet.cssRules[0].cssText)
/**thirdpartycss
* @description Used for fixing stuff
*/
您可以解析CSS,然后遍历sheet
对象的cssRules
以查找所有CSSComment
个实例。