[力扣每日一练]关于MySQL和pandas的正则表达式应用

发布于:2025-03-29 ⋅ 阅读:(25) ⋅ 点赞:(0)

一:题目要求

表: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

孰能生巧