如何用Python处理大文件换行符并正确提取邮箱地址
解决方案
修改后的Python脚本
import re filename = "input.txt" output_filename = "output.txt" # 修正正则表达式:移除前后多余的\s*,修正字符集中的无效|符号 email_regex = r'[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}' # 读取整个文件内容(避免逐行处理导致的跨换行匹配问题) with open(filename, "r", encoding="utf-8") as f: content = f.read() # 提取所有匹配的邮箱地址 emails = re.findall(email_regex, content) # 将结果写入输出文件,每个邮箱占一行 with open(output_filename, "w", encoding="utf-8") as out: for email in emails: out.write(email + "\n")
问题原因分析
逐行处理的局限性
原脚本按行读取文件,无法处理两种情况:- 邮箱地址被多余的换行符拆分到多行(如
exa\nmple@example.com); - 行内包含字面转义的
\n字符(即文件中实际存储的是\和n两个字符,而非换行符),此时逐行处理会让正则错误匹配到n作为邮箱开头。
- 邮箱地址被多余的换行符拆分到多行(如
正则表达式的错误
原正则开头的\s*仅能匹配空白字符(空格、换行等),无法跳过非空白的干扰字符(如字面\)。当遇到CC\nexample@example.com这类内容时,\s*匹配不了\,正则会从后续的n开始匹配,最终得到错误的nexample@example.com。而测试脚本中的正则直接匹配邮箱模式,会自动跳过所有非邮箱格式的前缀字符,因此能得到正确结果。
额外优化建议
如果文件体积极大(如超过1GB),一次性读取内存压力过大,可以采用分块读取结合re.finditer的方式,同时注意处理块边界可能拆分邮箱的情况(需要保留上一块的末尾部分,与下一块拼接后再匹配)。
内容的提问来源于stack exchange,提问作者yavuzwb
相关产品推荐
相关产品推荐

