如何删除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
相关产品推荐
相关产品推荐

