【编程】Python用正则表达式动态替换

欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】

我们都知道可以利用Python的正则表达式的replacesub来实现文字内容替换,但是如何实现动态替换呢?比如把文章中的所有图-[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。

  1. 获取当前文件夹下所有文件列表files,同时将文件名中划线前面的数字放入列表fids
  2. 函数func根据全局变量fidn合成图-fid-n字符串返回,并自增n。
  3. 针对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

推荐阅读更多精彩内容