Python正则替换以172开头的IP地址(大文件高效处理)
解决日志文件中隐藏172开头IP的问题
嘿,我来帮你搞定这个隐藏日志里IP的事儿!首先得说,你原来的正则表达式有点问题,没匹配到完整的IP,而且只处理了行首的内容,咱们来一步步修正,同时兼顾大文件的高效处理。
问题分析
你原来的代码里,r"^172\.*"这个正则只能匹配行开头的172,后面跟任意个点,这完全不是匹配完整IP的正确方式,而且替换成XXX.也达不到你想要的隐藏效果。另外,158MB的文件确实不适合一次性全读入内存,咱们用逐行处理的方式,既高效又省内存,而且完全不用额外的for循环或if判断,靠正则本身就能搞定所有匹配。
正确的解决方案
1. 编写正确的正则表达式
要匹配所有172开头的标准IP地址,正则应该写成:
r'\b172\.\d{1,3}\.\d{1,3}\.\d{1,3}\b'
\b是单词边界,避免把类似1720.1.1.1这种包含172的字符串误判成IP;\d{1,3}匹配1到3位数字,对应IP的每个段;- 整个正则能精准匹配
172.x.x.x格式的IP。
2. 大文件的高效处理代码
咱们用Python的文件上下文管理器(with语句)逐行读取文件,处理后写入新文件,这样内存只保留当前行的内容,不会因为文件大而卡顿:
import re # 预编译正则,提升重复匹配的效率 ip_regex = re.compile(r'\b172\.\d{1,3}\.\d{1,3}\.\d{1,3}\b') # 替换后的目标字符串 hidden_ip = 'XXX.XXX.XXX.XXX' # 替换文件路径(根据你的实际路径修改) input_log_path = 'your_original_log.txt' output_log_path = 'your_hidden_ip_log.txt' # 逐行处理文件 with open(input_log_path, 'r', encoding='utf-8') as in_file, open(output_log_path, 'w', encoding='utf-8') as out_file: for line in in_file: # 替换当前行中所有匹配的IP processed_line = ip_regex.sub(hidden_ip, line) out_file.write(processed_line)
为什么这个方案适合你?
- 无需额外循环/判断:
re.sub会自动扫描当前行的所有匹配项并替换,不用你手动遍历字符或做条件判断; - 内存友好:逐行处理不会把158MB的文件全塞进内存,运行更流畅;
- 效率高:预编译正则(
re.compile)让重复匹配的速度更快,适合处理大文件。
测试验证
用你给出的示例文本测试的话,运行这段代码后,就能得到你期望的输出:
ABCDEFGHIJKLMNOPRSTXXX.XXX.XXX.XXXRSTUVYZ ASDGXXX.XXX.XXX.XXXFSDGHSFSDFDSFHSF !'%%&!'+!'+%&!ÂSDBSDFXXX.XXX.XXX.XXXSADASFSA ASGFGD XXX.XXX.XXX.XXX ASDSAFASFDASSADSA
内容的提问来源于stack exchange,提问作者korimusk
相关产品推荐
相关产品推荐

