python中的正则表达式在CSS中获取javadoc样式的注释

时间:2010-09-23 16:56:19

标签: python css regex javadoc

我正在编写一个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类的列表,本质上,但这只是在一个块中返回整个字符串。

有人能指出我正确的方向吗?

感谢。 马特

2 个答案:

答案 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个实例。