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

如何删除DataFrame中非邮箱行?求更优邮箱数据清洗方案

清理DataFrame中的无效邮箱行

先还原你的问题场景:

我有一个需仅保留邮箱地址的DataFrame,数据如下:

email
1   jquery@3.5                         #it is not an e-mail so delete it
2   amministrazione@edilportale.com    #it is a a e-mail so keep it
3   258x530@2x.png                     #it is not an e-mail so delete it
4   secco@2x.png                       #...

请问如何删除其中非邮箱的行?我设想可通过判断点(.)后为数字或.png等图片后缀来删除,该如何实现?是否有更优方案?
补充说明:我此前爬取邮箱时使用的正则表达式为:

mail_list = re.findall('\w+@\w+\.{1}\w+', html_text)

嘿,你的思路完全可行,但确实有更通用的优化方案,我分两种情况给你讲:

一、实现你设想的判断逻辑

如果你就想按照“点后是数字”或者“图片后缀”来过滤,用pandas的字符串匹配就能搞定:

先构造示例DataFrame(和你的数据对应):

import pandas as pd

df = pd.DataFrame({
    'email': [
        'jquery@3.5',
        'amministrazione@edilportale.com',
        '258x530@2x.png',
        'secco@2x.png'
    ]
})

然后写排除规则的正则,筛选出不满足无效条件的行:

# 匹配两种无效情况:@后面带.数字,或者结尾是.png(可以加其他图片后缀比如.jpg)
valid_df = df[~df['email'].str.contains(r'@.*\.\d+|@.*\.png$', case=False)]

这里的~是取反的意思,相当于“保留不匹配这两种情况的行”,运行后你就能得到只有amministrazione@edilportale.com的有效DataFrame了。

二、更优方案:用严谨的邮箱正则筛选

你的爬取正则比较简单,可能会漏掉很多合法邮箱(比如user.name@domain.co.uk这种带点的用户名或多后缀域名),也会误抓无效格式。推荐用更贴合邮箱规范的正则来筛选,一步到位更准确:

# 适配大多数常见邮箱格式的正则
email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'

# 筛选符合标准邮箱格式的行
valid_df = df[df['email'].str.match(email_pattern)]

这个正则的逻辑是:

  • 用户名部分允许字母、数字和._%+-这些合法符号
  • 域名主体允许字母、数字、.和-
  • 域名后缀必须是.+至少2个字母(覆盖.com、.org、.co.uk这类常见后缀)

用这个方法,不仅能排除你提到的无效行,还能过滤其他奇奇怪怪的无效格式,比单独判断数字或图片后缀要通用得多。

三、额外建议:爬取阶段就优化

既然你是爬取得到的邮箱,其实可以直接在爬取时就用这个严谨的正则,减少后续清理的麻烦:

mail_list = re.findall(email_pattern, html_text)

这样爬出来的就是已经符合规范的邮箱,DataFrame自然就不用再清理啦~


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:20:29