You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python处理MySQL备份文件:同一行多邮箱混淆重复问题求助

解决SQL备份中多邮箱替换为唯一哈希的问题

问题根源

你的代码里repl函数用了hash(line)——也就是对整行文本计算哈希,所以同一行里所有匹配到的邮箱都会被替换成同一个哈希值,这就是同一行多个邮箱重复的核心原因。

修复思路

让每个匹配到的邮箱生成独立的哈希值,只需要基于当前匹配到的邮箱字符串计算哈希,而不是整行内容。

基础修复版本

修改repl函数,使用match.group()获取当前匹配的邮箱,再对这个字符串计算哈希:

import re

with open("dump.sql", "r") as file:
    lines = file.readlines()

def repl(match):
    # 基于匹配到的邮箱本身计算哈希,确保每个邮箱对应唯一值
    email_hash = str(hash(match.group()))
    return f"-{email_hash}@example.com"

new_lines = []
for line in lines:
    new_lines.append(re.sub(r'([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})', repl, line))

with open("dump-processed.sql", "w") as file:
    file.writelines(new_lines)

这个版本会让同一行里的每个邮箱生成各自的哈希,完全符合你的预期输出。

更稳定的哈希方案(可选)

Python内置的hash()函数在不同运行环境(比如不同Python版本、不同进程)中可能生成不同的值,如果需要生成固定不变的哈希值,可以用hashlib库生成MD5/SHA256哈希,取前若干位保证唯一性:

import re
import hashlib

with open("dump.sql", "r") as file:
    lines = file.readlines()

def repl(match):
    email = match.group().encode('utf-8')
    # 生成MD5哈希,转为整数后作为唯一标识
    email_hash = int(hashlib.md5(email).hexdigest(), 16)
    return f"-{email_hash}@example.com"

new_lines = []
for line in lines:
    new_lines.append(re.sub(r'([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})', repl, line))

with open("dump-processed.sql", "w") as file:
    file.writelines(new_lines)

效果验证

修复后,你的样例数据会输出:

INSERT INTO `users` VALUES ('john','-5196869426929071700@example.com','\0'),('kate','-7140769694376981046@example.com','\0'),
INSERT INTO `users` VALUES ('peter','-4574418619379266923@example.com','\0'),

每个邮箱都有独立的唯一哈希,满足UNIQUE索引的要求。

内容的提问来源于stack exchange,提问作者Soundcheck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:12:40