跳转至

3436. 查找合法邮箱

题目描述

表:Users

+-----------------+---------+
| Column Name     | Type    |
+-----------------+---------+
| user_id         | int     |
| email           | varchar |
+-----------------+---------+
(user_id) 是这张表的唯一主键。
每一行包含用户的唯一 ID 和邮箱地址。

编写一个解决方案来查找所有 合法邮箱地址。一个合法的邮箱地址符合下述条件:

  • 只包含一个 @ 符号。
  • 以 .com 结尾。
  • @ 符号前面的部分只包含 字母数字 字符和 下划线
  • @ 符号后面与 .com 前面的部分 包含 只有字母 的域名。

返回结果表以 user_id 升序 排序。

 

示例:

输入:

Users 表:

+---------+---------------------+
| user_id | email               |
+---------+---------------------+
| 1       | alice@example.com   |
| 2       | bob_at_example.com  |
| 3       | charlie@example.net |
| 4       | david@domain.com    |
| 5       | eve@invalid         |
+---------+---------------------+

输出:

+---------+-------------------+
| user_id | email             |
+---------+-------------------+
| 1       | alice@example.com |
| 4       | david@domain.com  |
+---------+-------------------+

解释:

  • alice@example.com 是合法的因为它包含一个 @,alice 是只有字母数字的,并且 example.com 以字母开始并以 .com 结束。
  • bob_at_example.com 是不合法的因为它包含下划线但没有 @
  • charlie@example.net 是不合法的因为域名没有以 .com 结尾。
  • david@domain.com 是合法的因为它满足所有条件。
  • eve@invalid 是不合法的因为域名没有以 .com 结尾。

结果表以 user_id 升序排序。

解法

方法一:正则表达式

我们可以使用正则表达式,通过 REGEXP 来匹配符合条件的邮箱地址。

1
2
3
4
5
# Write your MySQL query statement below
SELECT user_id, email
FROM Users
WHERE email REGEXP '^[A-Za-z0-9_]+@[A-Za-z][A-Za-z0-9]*\\.com$'
ORDER BY 1;
1
2
3
4
5
6
7
8
import pandas as pd


def find_valid_emails(users: pd.DataFrame) -> pd.DataFrame:
    email_pattern = r"^[A-Za-z0-9_]+@[A-Za-z][A-Za-z0-9]*\.com$"
    valid_emails = users[users["email"].str.match(email_pattern)]
    valid_emails = valid_emails.sort_values(by="user_id")
    return valid_emails

评论