0
点赞
收藏
分享

微信扫一扫

利用re实现修改测试用例格式——python实现

q松_松q 2022-03-12 阅读 65

利用re实现修改测试用例格式——python实现

前言

问题简述

我们还是那道蜡烛盘子问题为例。

先看下它的一个测试用例(leetcode原生)

然后我在oj上对这道题的输入和输出要求是这样的

在这里插入图片描述

我们当然可以自己修改输入或者输出的要求,但是录题是为了帮助其他同学练习,难道要为难他们要去专门输入像leetcode格式那样的字符串带双引号,数组带方括号?

显然,作为录题人,我觉得应该自己处理这些用例的格式,正好之前包括最近都在做一个使用python的re模块的项目,所以我便想到了,是不是可以编写一个程序实现对测试样例的内容的修改。

当然很多人可能会想这其实可以手动修改格式,去除一些符号,然后换行罢了,没必要专门写一个程序吧?那么,还记得这道题,使用暴力模拟为什么过不了,因为超时,为什么会超时,因为leetcode给了一个非常大的测试用例,可以通过下面的图片感受一下它的庞大与恐怖

在这里插入图片描述

这只是字符串的部分,数组的更多,看到这个测试用例的时候,我是崩溃的,我只能说leetcode算你狠,难怪模拟过不了。所以,面对这种数量非常庞大的数据,我们手动操作的话可能会直接寄。作为一个热爱编程的程序员,我们的任务就应该是将化繁为简,所以我就写了一个程序demo来实现。

方法介绍

re模块

我在代码中主要使用了re模块,这是正则表达式模块,很多语言都有该模块的库,而在python中该模块的库就叫re。

正则表达式是一种用于识别字符串的方法,通过正则表达式,我们可以更加高效地识别检测字符串的内容。

而关于python re库的更多内容,大家可以直接搜索了解,有机会的话我也会整理一下它的知识点。

我们在这个demo中主要使用了下列的三个函数

complie(str):将str字符串编译成正则表达式对象

match(表达式,str):对str字符串进行正则表达式匹配,匹配到第一个内容为止,如果匹配不到,则会返回None

对象.sub(str1,str2): 利用正则表达式对象对str2进行检测,将检测到的部分替换为str1,默认检测到str2的所有。

os模块和文件操作

除了使用到re模块,我们在该程序中还使用了python的文件操作和OS模块,这里不细写了,只写一个用到的函数。

os.listdir(path):将path下的文件以列表的形式返回

需要的材料

我们可以使用记事本将leetcode上的用例复制粘贴然后保存到相应的路径下,比如下面这样。
在这里插入图片描述

code(python)

import re
import os

def ModifyContent(path):
    """
    修改文件的内容
    面向txt文件
    主要事leetcode的测试样例往往有双引号和方括号
    该篇主要用于处理这些变成我们熟悉的样例
    :param path: 文件地址
    :return:
    """
    # 打开文件
    file = open(path, 'r+')
    # 读取文件内容
    content = file.read()
    lines = content.split('\n')

    # 四个正则表达式对象
    # 用于去除引号
    pattern1 = re.compile(r'\"([^"]*)\"')
    # 识别最左边和最右边的两个方括号
    pattern2 = re.compile(r'\[\[|]]')
    # 识别一维数组
    pattern3 = re.compile(r'],\[')
    # 识别一维数组的元素之间的分隔
    pattern4 = re.compile(r',')

    # 匹配字符串内容
    res = pattern1.match(content)
    # 获取字符串内的内容
    s1 = res.group(1)
    # 计算一维数组的数量
    n = len(pattern3.findall(content)) + 1
    s2 = lines[1]
    # 去除最左边或者最右边的两个分括号
    s2 = pattern2.sub('', s2)
    # 将一维数组之间使用换行分隔
    s2 = pattern3.sub('\n', s2)
    # 将元素之间使用空格分隔
    s2 = pattern4.sub(' ', s2)
    # 将内容连接起来
    content = s1 + '\n' + str(n) + '\n' + s2 + '\n'
    print(content)
    # 先关闭文件操作符
    file.close()

    # 再使用w+模式打开,利用该特性将文件原本的内容删除
    file = open(path, 'w+')
    # 将内容输出到文件中,实现对内容的修改
    print(content, file=file)


def batch(path):
    """
    主要是文件路径下的txt文件全部修改为指定内容
    通过循环调用ModifyContent函数即可
    :param path:    路径
    :return:
    """
    # 获取路径下的文件
    files = os.listdir(path)
    for file in files:
        # 文件路径
        filePath = path + "\\" + file
        ModifyContent(filePath)

path = "F:\\刷\\leetcode\\22年3月\\blog\\testdemo"
batch(path)

这里的path,朋友们如果需要,需要根据自己的实际情况进行修改。

后话

举报

相关推荐

0 条评论