在Python中使用正则表达式提取CSS中的Javadoc风格注释

1 投票
2 回答
594 浏览
提问于 2025-04-16 04:30

我正在写一个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 个回答

1

@Alex 说得对(他有错过吗?不过我扯远了)。如果你需要的解析比正则表达式能提供的更具体,使用自定义解析器会更好。幸运的是,你不需要重新发明轮子(CSS解析的轮子)。已经有现成的解决方案了。

我之前也遇到过类似的需求。那时候,cssutils模块帮了我大忙。我刚复习了一下cssutils的用法,为你准备了这个代码片段:

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实例。

2

{(.*)} 是一种贪婪匹配方式——它会从第一个 { 匹配到最后一个 },因此会把里面可能包含的任何 {/} 对都一起匹配上。你需要的是非贪婪匹配,也就是

{(.*?)}

区别在于星号后面加了一个问号,这样就变成了非贪婪匹配。

不过,如果你需要正确匹配“嵌套”的大括号,这种方法仍然不行——实际上,在正则表达式的世界里,没有任何方法可以做到这一点:在正则语言中,有很多众所周知的限制(正则语言是指正则表达式能够匹配的语言),其中之一就是“正确嵌套”任何类型的开闭括号是不可能的(有些极其复杂的所谓正则表达式可以做到,但Python的正则表达式不行,而且任何有计算机科学背景的人都会觉得称这些表达式为“正则”的说法很冒犯;-)。如果你需要比正则表达式更通用的解析方式,pyparsing 或其他完整的Python解析器才是正确的选择。

撰写回答