【编程】Python用正则表达式动态替换
2019-12-29 本文已影响0人
zhyuzh3d
欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】
我们都知道可以利用Python的正则表达式的replace
和sub
来实现文字内容替换,但是如何实现动态替换呢?比如把文章中的所有图-[0-9]+
依次替换为图-1、图-2、图-3...
?
仍然使用re.sub
方法,但要把它的第二个参数换为函数func
,并让它自动变换返回内容,也就是说第一次func(obj)
返回'图-1'
,第二次就返回'图-2'
,...这有很多方法可以实现,我这里用了最简单的方法,——使用了一个n作为全局变量,每次func
函数会对它加1。
下面代码的作用是将当前目录下面所有的.md文件(README.md除外)内的图-x-x
都依次替换,第一个x替换为文件名开头的数字(文件名遵照01-某某某.md
格式),第2个x使用自增的n。
- 获取当前文件夹下所有文件列表
files
,同时将文件名中划线前面的数字放入列表fids
。 - 函数
func
根据全局变量fid
和n
合成图-fid-n
字符串返回,并自增n。 - 针对
files
列表的每个文件执行操作:
- 更新全局fid给func备用。
- 打开文件读取内容
cont
,然后用sub
函数替换掉所有图-x-x
文字。 - 读写位置跳到0,写入修改后的
cont
。 - 重置n=1。
# 将同目录下所有.md文件的图片序号自动修正
from os import listdir
from os.path import isfile, join
import os
import re
vol = 1 # 第几部分
# 获取目录内的全部文件
dir_path = os.path.dirname(os.path.realpath(__file__))
onlyfiles = [f for f in listdir(dir_path) if isfile(join(dir_path, f))]
files = []
fids = []
for f in onlyfiles:
if f.find('.md') != -1 and f != 'README.md':
fids.append(int(f.split('-')[0]))
files.append(join(dir_path, f))
fid = 0 # 当前循环的章节索引,每个md文件开始时候更新
n = 1 # 当前图片的循环索引,每个md文件结束后重置
# 每次替换时候使用的函数,自动更新n值
def func(obj):
global n, fid
s = f'<font size=2>图{vol}-{fid}-{n}:'
n += 1
return s
pattern = re.compile('<font size=2>图[0-9]+-[0-9]+-[0-9]+:')
print('STARTING....')
# 执行替换操作
# for i in range(7,8):
for i in range(len(files)):
file = files[i]
fid = fids[i] # 每个文件开始更新fid
cont=''
with open(file, mode='r+', encoding='utf8') as f:
cont = f.read()
cont = re.sub(pattern, func, cont)
f.seek(0) # 回到顶端执行替换
f.write(cont)
print(f'>OK-{fid}:{f.name}')
n = 1 # 每个md文件完毕后重置n值
print('ALL OK!')
欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】
每个人的智能新时代
如果您发现文章错误,请不吝留言指正;
如果您觉得有用,请点喜欢;
如果您觉得很有用,欢迎转载~
END