一:题目要求
表: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 升序排序。
可见要求是:
1.只包含一个特殊字符@
2.结尾必须是字符.com
3.@前的字符有且只能有大小写字母以及下划线
4.@后,.com前的字符只能是大小写字母
二:MySQL实现
1.在正则表达式中插入一个@即可
2.最后以//.com$.$结尾表示结尾的字符是.com,\\表示符号转义为字符串
3.[a-zA-Z_]*在@前表示大小写字母和字符串,*表示出现了多次
4.在@和\\.com$间:[a-zA-Z]*表示出现大或小写字母多次
最后注意在开头添加^表示正则表达式的开始,与$相呼应
# Write your MySQL query statement below
SELECT *
FROM Users
WHERE email regexp '^[a-zA-Z0-9_]*@[a-zA-Z]*\\.com$'
三:pandas实现
与MySQL相似,注意,python中的正则表达式转义反斜杠只需要一个即可,这与MySQL转义需要两个反斜杠不同。由于python中的正则表达式匹配只能应用于一维数据,所以我将匹配结果返回到一个变量中,然后再将该变量放到二维数据集的切片中,以此来实现布尔值匹配
import pandas as pd
def find_valid_emails(users: pd.DataFrame) -> pd.DataFrame:
data=users['email'].str.contains('^[0-9a-zA-Z_]*@[a-zA-Z]*\.com$')
#进行布尔值过滤
users = users[data]
return users
孰能生巧