美文网首页人工智能通识我爱学编程
【编程】Python用正则表达式动态替换

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

作者: zhyuzh3d | 来源:发表于2019-12-29 10:56 被阅读0次

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

    我们都知道可以利用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

    相关文章

      网友评论

        本文标题:【编程】Python用正则表达式动态替换

        本文链接:https://www.haomeiwen.com/subject/jbkyoctx.html