Skip to content

Latest commit

 

History

History
127 lines (92 loc) · 3.55 KB

File metadata and controls

127 lines (92 loc) · 3.55 KB
comments difficulty edit_url tags
true
简单
数据库

English Version

题目描述

表:Users

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

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

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

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

 

示例:

输入:

Users 表:

+---------+---------------------+
| user_id | email               |
+---------+---------------------+
| 1       | [email protected]   |
| 2       | bob_at_example.com  |
| 3       | [email protected] |
| 4       | [email protected]    |
| 5       | eve@invalid         |
+---------+---------------------+

输出:

+---------+-------------------+
| user_id | email             |
+---------+-------------------+
| 1       | [email protected] |
| 4       | [email protected]  |
+---------+-------------------+

解释:

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

结果表以 user_id 升序排序。

解法

方法一:正则表达式

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

MySQL

# 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;

Pandas

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