一:題目要求
表: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 pddef 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
孰能生巧