使用正则表达式或其他工具使用python进行CSS解析?

时间:2018-10-10 04:02:54

标签: python regex

我正在尝试解析CSS文件以更改html样式。 查看示例CSS文本,如下所示:

p.FM_table_cell_body308 {
      margin-left:0.000pt;
      margin-right:0.000pt;
      text-align:left;
      text-indent:0.000pt;
}

p.FM_table_cell_body309 {
      margin-left:0.000pt;
      margin-right:0.000pt;
      text-align:left;
      text-indent:0.000pt;
}

p.FM_table_cell_body {
      margin-left:0.000pt;
      margin-right:0.000pt;
      text-align:left;
      text-indent:0.000pt;
}

我想更改“ text-align:left;”的“ left”一词到“ p.FM_table_cell_body *** {”(***是数字)下的每个“中心”。

所以,这就是我所期待的:

p.FM_table_cell_body308 {
      margin-left:0.000pt;
      margin-right:0.000pt;
      text-align:center;
      text-indent:0.000pt;
}

p.FM_table_cell_body309 {
      margin-left:0.000pt;
      margin-right:0.000pt;
      text-align:center;
      text-indent:0.000pt;
}

p.FM_table_cell_body {   # this has no number so should pass
      margin-left:0.000pt;
      margin-right:0.000pt;
      text-align:left;   # no change
      text-indent:0.000pt;
}

到目前为止,这是我正在编码的内容:

from bs4 import BeautifulSoup
import glob2  
import re

with open ("C:\\TEST\\HTML\\Output_sample1\\Responsive HTML5\\Output.css","r",encoding="utf-8") as file_css :
    with open ("C:\\TEST\\HTML\\Output_sample1\\Responsive HTML5\\Output_test.css","wt",encoding="utf-8") as file_css_text_align :
        lines_css = file_css.readlines()
        for i_css, line_css in enumerate(lines_css[:-1]):
            try :
                FM_number_css = re.findall('FM_table_cell_body[1-9][0-9]?[0-9]?[0-9]?', line_css)
                text_align_content = lines_css[i_css + 3]
                if FM_number_css and text_align_content == 'text-align:left;':
                    text_align_content = text_align_content.split(':')
                    text_align_content.remove('left;\n')
                    text_align_content.insert(1, 'center;\n')
                    new_text_align_content = ':'.join(text_align_content)

                    file_css_text_align.write(str(new_text_align_content))
                 else :
                     file_css_text_align.write(str(line_css))
             except : 
                 pass

但是我尝试制作的此代码无法正常工作。 该代码不是将this(text-align:left;)更改为(p.FM_table_cell_body *** {)更改为text-align:center;

你们会给我一些建议吗?

谢谢你,祝你有美好的一天。

1 个答案:

答案 0 :(得分:1)

您可以将单个正则表达式与re.sub一起使用:搜索

(p\.FM_table_cell_body\d+ {[^}]+text-align:)left

捕获一个节中的所有内容,最多捕获一个组中的text-align:,然后进行 match 'left',并替换为捕获的第一个组和'center',从而将'left'替换为'center'

https://regex101.com/r/r0dDBz/1

input = '''p.FM_table_cell_body308 {
      margin-left:0.000pt;
      margin-right:0.000pt;
      text-align:left;
      text-indent:0.000pt;
}

p.FM_table_cell_body309 {
      margin-left:0.000pt;
      margin-right:0.000pt;
      text-align:left;
      text-indent:0.000pt;
}

p.FM_table_cell_body {
      margin-left:0.000pt;
      margin-right:0.000pt;
      text-align:left;
      text-indent:0.000pt;
}'''
print(re.sub(r'(p\.FM_table_cell_body\d+ {[^}]+text-align:)left', r'\1center', input))