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

如何用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")

问题原因分析

  1. 逐行处理的局限性
    原脚本按行读取文件,无法处理两种情况:

    • 邮箱地址被多余的换行符拆分到多行(如exa\nmple@example.com);
    • 行内包含字面转义的\n字符(即文件中实际存储的是\和n两个字符,而非换行符),此时逐行处理会让正则错误匹配到n作为邮箱开头。
  2. 正则表达式的错误
    原正则开头的\s*仅能匹配空白字符(空格、换行等),无法跳过非空白的干扰字符(如字面\)。当遇到CC\nexample@example.com这类内容时,\s*匹配不了\,正则会从后续的n开始匹配,最终得到错误的nexample@example.com。而测试脚本中的正则直接匹配邮箱模式,会自动跳过所有非邮箱格式的前缀字符,因此能得到正确结果。

额外优化建议

如果文件体积极大(如超过1GB),一次性读取内存压力过大,可以采用分块读取结合re.finditer的方式,同时注意处理块边界可能拆分邮箱的情况(需要保留上一块的末尾部分,与下一块拼接后再匹配)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:52:52