如何将代码块拆分为列表?

时间:2016-06-25 14:20:46

标签: python css regex list python-3.x

我想将CSS文件的内容拆分为代码块,并使用Python 3.5将每个代码块推送到一个列表中。

所以,鉴于这个CSS:

h1 {color: #333, background-color: transparent}
h2 {
  font-weight:300
}
h3
{
  font-weight: 200
}

我们可以清楚地告诉它有多种样式和/或类型的缩进意味着CSS必须整理才能得到这个:

h1 {
  color: #333,background-color: transparent;
}

h2 {
  font-weight: 300;
}

h3 {
  font-weight: 200;
}

如何使用Python读取整齐的CSS字符串并将其中的每个代码块推送到这样的Python列表中:

styles = [
  "h1 {\n  color: #333,background-color: transparent;\n}",
  "h2 {\n  font-weight: 300;\n}",
  "h3 {\n  font-weight: 200;\n}"
]

我还想指出RegExp并不是我的强项,而且我不太确定RegEx使用什么,但我认为我可以使用RegExp& [].split(...);共同实现这一目标。

甚至可以使用RegExp来消除在分割代码块之前整理样式表的需要。

注意:我已经检查了这个this问题,但不幸的是,这也没有帮助。

2 个答案:

答案 0 :(得分:3)

此实现使用tinycss完成,这是一个简单的纯python css parser

这适用于 untidied css。只要是合法的。

import tinycss
from collections import defaultdict

parser = tinycss.make_parser('page3')
# use parse_stylesheet_files to read from a file.
stylesheet = parser.parse_stylesheet("""h1 {color: #333; background-color: transparent}
        h2 {
              font-weight:300
        }
        h3
        {
              font-weight: 200
        }
        h1{
        padding: 0px;}
        """)

# Initialize to empty list if key does not exists
# This allows to group multiple blocks with same selectors
temp = defaultdict(list)

for rule in stylesheet.rules:
    for dec in rule.declarations:
       temp[rule.selector.as_css()].append((dec.name, dec.value.as_css()))

print(temp)

输出:

defaultdict(<class 'list'>,
            {'h1': [('color', '#333'),
                    ('background-color', 'transparent'),
                    ('padding', '0px')],
             'h2': [('font-weight', '300')],
             'h3': [('font-weight', '200')]})

了解不同的h1块如何被分组到一个列表中。我并不是非常清楚CSS的复杂性,但是很容易防止这种情况发生。

更灵活,因为它涵盖所有边缘情况,适用于选择器,CSS2和CSS3,与具有正则表达式的解决方案不同。

请注意:我已将所有内容都推送到字典中,但您也可以轻松将其作为列表推送。如果你想要一些纯粹的清单,请告诉我,但如果你明白我在做什么,那应该是相对微不足道的。

答案 1 :(得分:1)

您可以通过简单的文件读取和替换来实现此目的:

do {

  try realm.write({
    realm.add(<some object>)
  })
}
catch {}

输出:

styles = []
with open('file.css') as file:
    style = []
    for line in file.readlines():
        # If line is empty
        if not line.strip():
            # If a block is non-empty
            if style:
                styles.append("".join(style))
                style = []
        else:
            # Add to the current block
            style.append(line)
    styles.append("".join(style))