用不到 100 行的 Python 代码编写一个使用正则表达式来格式化文本的脚本

近期 ricky 有一个需要在一大段文本里找出需要的字符串或者行、还要删除重复行的需求,于是写了一个 Python 脚本来实现这个需求,在此 Ricky 把代码分享出来。

该脚本需要导入以下包:

# coding=utf-8
import os, re, sys

先来看一下 main 函数 —— main 函数里定义了输入文件( input.txt )和输出文件( output.txt ),把需要格式化的文本复制粘贴进 input.txt ,处理结果最终会输出到 output.txt ;这里需要注意的是每次运行脚本时 output.txt 文件都会先被删除(脚本运行完成后会把新的结果写入到 output.txt 文件中):

def main():
    print '当前 Python 版本号为:' + str(sys.version) + '\n'
    # print '当前 Python 路径为:' + str(sys.path) + '\n'
    input_txt = "input.txt"
    output_txt = "output.txt"

    # 如果 output.txt 文件存在,则删除
    if os.path.exists(output_txt):
        os.remove(output_txt)
        print('output.txt 文件已自动删除!\n')

    output_file = open(output_txt, 'a')
    input_file = open(input_txt, 'r')

    print '提示:输入文件为 input.txt ,输出文件为 output.txt\n'
    print '→ 使用正则表达式请输入 1'
    print '→ 删除重复的行请输入 2'
    print '→ 直接退出请按 0'
    is_next_input = True
    operation_code = '-1'
    while is_next_input:
        is_next_input = False
        operation_code = raw_input('→ 请输入数字:')
        if operation_code == '1':
            use_reg(input_file, output_file)
        elif operation_code == '2':
            delete_duplicate_lines(input_file, output_file)
        elif operation_code != '0':
            is_next_input = True
            print '无效字符,请重新输入!\n'

    input_file.close()
    output_file.flush()
    output_file.close()

    print '\n已退出' if operation_code == '0' else '\n处理完成,请查看 output.txt 文件!(下次执行该脚本时 output.txt 文件会自动删除)'


if __name__ == "__main__":
    main()

接下来是 delete_duplicate_lines 函数 —— 即对需要格式化的文本执行删除重复行的操作;这里需要注意的是该函数会先清除每一行字符串里的换行符和回车符,然后再将每行字符串放入 lines_set 集合中(如果两行字符串的字符是一样的,但一行有换行符,而另一行没有,这样代码里也会被当做不同的行来处理的,所以需要提前去除换行符和回车符):

def delete_duplicate_lines(input_file, output_file):
    lines_set = set()
    is_fisrt_line = True
    for line in input_file.readlines():
        line = re.sub(r'[\r\n]', '', line)
        if line not in lines_set:
            lines_set.add(line)
            if is_fisrt_line:
                is_fisrt_line = False
                output_file.write(line)
            else:
                output_file.write('\n' + line)

最后是 use_reg 函数 —— 即对需要格式化的文本执行正则表达式的相关操作(具体有哪些操作请参见下面的测试部分)。

def use_reg(input_file, output_file):
    print '\n正则表达式示例:匹配 IP 地址:192.168.[0-9]{1,3}.[0-9]{1,3},匹配域名:[^\s]*\.test\.com'
    reg = None
    while reg is None or reg == '':
        reg = str(raw_input('→ 请输入正则表达式:'))

    print '\n→ 把正则表达式【匹配到的字符串】输出到文件,请输入 1'
    print '→ 把正则表达式【匹配到的行】输出到文件,请输入 2'
    print '→ 把正则表达式【匹配不到的行】输出到文件,请输入 3'
    is_next_input = True
    is_fisrt_line = True
    after_line = None
    operation_code = '-1'
    while is_next_input:
        is_next_input = False
        operation_code = raw_input('→ 请输入数字:')
        if not (operation_code == '1' or operation_code == '2' or operation_code == '3'):
            is_next_input = True
            print '无效字符,请重新输入!\n'

    for line in input_file.readlines():
        line = re.sub(r'[\r\n]', '', line)
        match_obj = re.search(reg, line)
        if operation_code == '1':
            after_line = match_obj.group() if match_obj else None
        elif operation_code == '2':
            after_line = line if match_obj else None
        elif operation_code == '3':
            after_line = None if match_obj else line

        if after_line:
            if is_fisrt_line:
                is_fisrt_line = False
                output_file.write(after_line)
            else:
                output_file.write('\n' + after_line)

示例:

input.txt 文件中的内容如下所示:

欢迎访问:ccie.lol
ccie.lol
CCIE 工程师社区 ccie.lol
ccie.engineer
192.168.1.1
192.168.1.2
ccde.engineer
192.168.2.1
192.168.2.1
rhce.engineer

1、删除重复的行:

C:\Users\Ricky\venv\format\Scripts\python.exe C:/Users/Ricky/PycharmProjects/format/format.py
当前 Python 版本号为:2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)]

提示:输入文件为 input.txt ,输出文件为 output.txt

→ 使用正则表达式请输入 1
→ 删除重复的行请输入 2
→ 直接退出请按 0
→ 请输入数字:2

处理完成,请查看 output.txt 文件!(下次执行该脚本时 output.txt 文件会自动删除)

Process finished with exit code 0
Python 删除重复的行
Python 删除重复的行

output.txt 文件中的内容如下所示:

欢迎访问:ccie.lol
ccie.lol
CCIE 工程师社区 ccie.lol
ccie.engineer
192.168.1.1
192.168.1.2
ccde.engineer
192.168.2.1
rhce.engineer

2、把正则表达式【匹配到的字符串】输出到文件:

C:\Users\Ricky\venv\format\Scripts\python.exe C:/Users/Ricky/PycharmProjects/format/format.py
当前 Python 版本号为:2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)]

output.txt 文件已自动删除!

提示:输入文件为 input.txt ,输出文件为 output.txt

→ 使用正则表达式请输入 1
→ 删除重复的行请输入 2
→ 直接退出请按 0
→ 请输入数字:1

正则表达式示例:匹配 IP 地址:192.168.[0-9]{1,3}.[0-9]{1,3},匹配域名:[^\s]*\.test\.com
→ 请输入正则表达式:ccie(.)*

→ 把正则表达式【匹配到的字符串】输出到文件,请输入 1
→ 把正则表达式【匹配到的行】输出到文件,请输入 2
→ 把正则表达式【匹配不到的行】输出到文件,请输入 3
→ 请输入数字:1

处理完成,请查看 output.txt 文件!(下次执行该脚本时 output.txt 文件会自动删除)

Process finished with exit code 0
Python 把正则表达式【匹配到的字符串】输出到文件
Python 把正则表达式【匹配到的字符串】输出到文件

output.txt 文件中的内容如下所示:

ccie
ccie
ccie
ccie

3、把正则表达式【匹配到的行】输出到文件(之一):

您可以使用类似这样的正则表达式 (.)*ccie(.)* 来匹配行(本例所示),您也可以使用第四个例子(也就是下一个例子)的方式来匹配行。

C:\Users\Ricky\venv\format\Scripts\python.exe C:/Users/Ricky/PycharmProjects/format/format.py
当前 Python 版本号为:2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)]

output.txt 文件已自动删除!

提示:输入文件为 input.txt ,输出文件为 output.txt

→ 使用正则表达式请输入 1
→ 删除重复的行请输入 2
→ 直接退出请按 0
→ 请输入数字:1

正则表达式示例:匹配 IP 地址:192.168.[0-9]{1,3}.[0-9]{1,3},匹配域名:[^\s]*\.test\.com
→ 请输入正则表达式:(.)*ccie(.)*

→ 把正则表达式【匹配到的字符串】输出到文件,请输入 1
→ 把正则表达式【匹配到的行】输出到文件,请输入 2
→ 把正则表达式【匹配不到的行】输出到文件,请输入 3
→ 请输入数字:1

处理完成,请查看 output.txt 文件!(下次执行该脚本时 output.txt 文件会自动删除)

Process finished with exit code 0
Python 把正则表达式【匹配到的行】输出到文件
Python 把正则表达式【匹配到的行】输出到文件

output.txt 文件中的内容如下所示:

欢迎访问:ccie.lol
ccie.lol
CCIE 工程师社区 ccie.lol
ccie.engineer

4、把正则表达式【匹配到的行】输出到文件(之二):

C:\Users\Ricky\venv\format\Scripts\python.exe C:/Users/Ricky/PycharmProjects/format/format.py
当前 Python 版本号为:2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)]

output.txt 文件已自动删除!

提示:输入文件为 input.txt ,输出文件为 output.txt

→ 使用正则表达式请输入 1
→ 删除重复的行请输入 2
→ 直接退出请按 0
→ 请输入数字:1

正则表达式示例:匹配 IP 地址:192.168.[0-9]{1,3}.[0-9]{1,3},匹配域名:[^\s]*\.test\.com
→ 请输入正则表达式:ccie(.)*

→ 把正则表达式【匹配到的字符串】输出到文件,请输入 1
→ 把正则表达式【匹配到的行】输出到文件,请输入 2
→ 把正则表达式【匹配不到的行】输出到文件,请输入 3
→ 请输入数字:2

处理完成,请查看 output.txt 文件!(下次执行该脚本时 output.txt 文件会自动删除)

Process finished with exit code 0
Python 把正则表达式【匹配到的行】输出到文件
Python 把正则表达式【匹配到的行】输出到文件

output.txt 文件中的内容如下所示:

欢迎访问:ccie.lol
ccie.lol
CCIE 工程师社区 ccie.lol
ccie.engineer

5、把正则表达式【匹配不到的行】输出到文件:

C:\Users\Ricky\venv\format\Scripts\python.exe C:/Users/Ricky/PycharmProjects/format/format.py
当前 Python 版本号为:2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)]

output.txt 文件已自动删除!

提示:输入文件为 input.txt ,输出文件为 output.txt

→ 使用正则表达式请输入 1
→ 删除重复的行请输入 2
→ 直接退出请按 0
→ 请输入数字:1

正则表达式示例:匹配 IP 地址:192.168.[0-9]{1,3}.[0-9]{1,3},匹配域名:[^\s]*\.test\.com
→ 请输入正则表达式:ccie(.)*

→ 把正则表达式【匹配到的字符串】输出到文件,请输入 1
→ 把正则表达式【匹配到的行】输出到文件,请输入 2
→ 把正则表达式【匹配不到的行】输出到文件,请输入 3
→ 请输入数字:3

处理完成,请查看 output.txt 文件!(下次执行该脚本时 output.txt 文件会自动删除)

Process finished with exit code 0
Python 把正则表达式【匹配不到的行】输出到文件
Python 把正则表达式【匹配不到的行】输出到文件

output.txt 文件中的内容如下所示:

192.168.1.1
192.168.1.2
ccde.engineer
192.168.2.1
192.168.2.1
rhce.engineer

源代码下载:

请参见文章下方的 Article Attachments 部分,或者点击右侧链接:format.pyinput.txt(Python 2.7.15 ,亲测可执行)

打赏作者
这里是 “ CCIE 工程师社区 ” 官方的捐款通道,您是否可以考虑请我们喝杯咖啡呢?

您的支持将鼓励我们继续创作!

[微信] 扫描二维码打赏

[支付宝] 扫描二维码打赏

Article Attachments

Was this article helpful?

Related Articles

Leave A Comment?

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据