近期 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

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

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

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

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

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.py 和 input.txt(Python 2.7.15 ,亲测可执行)
发表评论?