Python笔记04-利用正则实现批量替换

Python笔记04-利用正则实现批量替换

最近在做用django搭建一个商城网页(当然是模拟的),其中取得了大量的静态html文件,这些文件需要放入templates文件中,附带的样式这样放入static中,但这样就出现了一个很麻烦的事情,就是html中样式引入和图片引入需要修改的问题!

<link rel="stylesheet" href="css/pub.css"/>
<link rel="stylesheet" href="css/log.css"/>
<link rel="stylesheet" href="css/color.css"/>
<img src="images/u_logo.jpg" alt="商城"/>

上面的标签需要修改成如下形式:

<link rel="stylesheet" href="{% static 'css/pub.css' %}"/>
<link rel="stylesheet" href="{% static 'css/log.css' %}"/>
<link rel="stylesheet" href="{% static 'css/color.css' %}"/>
<img src="{% static 'images/u_logo.jpg' %}" alt="商城"/>

当然头部还要插入

{% load static %}

看了下这样的html文件有接近20个,每个里面的img标签更是数不胜数,难道真的要Ctrl+C Ctrl+V 一个一个慢慢的弄??
于是我想到了一个办法,正则!!!!
那么第二个问题来了。。。。如何用使用正则!!!!!
这里我先说一下我的思路,就是用Python打开文件,使用正则匹配要修改的字段,然后修改相关字段,最后在头部加上刚才说静态载入标签,核心在于匹配和修改(替换)。
这里需要用到re.sub(), 我就直接贴代码了,

import os,re
#!!!!!!!特别提醒html所在目录,记得以  /  结尾!!!!!
#!!!!!!!特别提醒html所在目录,记得以  /  结尾!!!!!
#!!!!!!!特别提醒html所在目录,记得以  /  结尾!!!!!
path =r'D:\Djangopro\shop\templates/'
file_list = os.listdir(path)
print(file_list)
for i in file_list:
    name_suffix = re.search(r'.*?(\.html)$',i)#取html后缀
    if name_suffix:
        print(i)
        with open(path+i,'rb') as f:
            con = f.read().decode('utf-8')
            con_src = re.sub(r'src="(.*?)"','src="{% static '+"'\g<1>'"+' %}"',con)#对src后面加入静态标签
            con_href = re.sub(r'(<link.*?href=")(.*?)(".*?>)','\g<1>'+'{% static '+"'\g<2>'"+' %}'+'\g<3>',con_src)#对link标签里面的href进行修改
        with open(path+i,'wb') as f:
            fix = '{% load static %}\r\n'
            message = fix + con_href
            print(message)
            f.write(message.encode('utf-8'))

首先设置html文件所在目录,就是对着文件右键看属性,然后一套CV二连,但这样会出现\转义的问题,所以直接给了个r’ ‘,然后一定要以’/‘做结尾,这是为了后面的文件操作。
接下来读取目录下所有的文件(及文件夹),然后一个遍历,通过正则匹配到后缀为.html的文件,开始操作!
以二进制的形式读取文件,解个码;
用sub匹配re.sub(r’src="(.?)"’,‘src="{% static ‘+"’\g<1>’"+’ %}"’,con)里面有三个部分:
1.r’src="(.
?)"‘正则表达式;
2.‘src="{% static ‘+"’\g<1>’"+’ %}"替换匹配出的内容(可以是函数),里面的\g<1> 表示的是第一个()里面的内容,我承认这里面的引号双引号有点昏,所以有了后面的方法。
3.第三个就不用说了。
把src= 给添加上了,然后就是link里面的href了,还是用到sub。
1.r’(<link.?href=")(.?)(".*?>)’,这里三个括号,分别表示 以link标签开头直到遇到第一个href=“停止的内容,第二个括号就是我们要修改的内容,第三个则是href=“之后碰到的第一个"和后面的所有内容直到碰到>,这样一来就匹配出来了link标签里面的href=“” 里面的内容了。
2.修改,,’\g<1>’+’{% static '+”’\g<2>’”+’ %}’+’\g<3>’ 就是第一个括号的内容+添加头尾后的第二个括号的内容+第三个括号的内容。
3.不用说了吧。
后面就是对内容加上{% load static %} 注意添加上换行符,
最后原封不动的写入进去,完事!
不过这里有个优化的地方,我这里做了两次的全文匹配,讲道理是可以一次的,可是我暂时没想到,希望有大神能出来指点指点。

猜你喜欢

转载自blog.csdn.net/q275343119/article/details/82765248