題目描述
一個有效的電子郵件具有字首名稱和域,其中:
- 字首 名稱是一個字串,可以包含字母(大寫或小寫), 數字,
'_'
,'.'
, 和破折號'—'
, 字首名必須以字母開頭- 域名 為
'@leetcode.com'
編寫一個解決方案,以查詢具有有效電子郵件的使用者, 以任何順序返回結果表。
測試用例
輸入
user_id | name | |
---|---|---|
1 | Winston | winston@leetcode.com |
2 | Jonathan | jonathanisgreat |
3 | Annabelle | bella-@leetcode.com |
4 | Sally | sally.come@leetcode.com |
5 | Marwan | quarz#2020@leetcode.com |
6 | David | david69@gmail.com |
7 | Shapiro | .shapo@leetcode.com |
輸出
user_id | name | |
---|---|---|
1 | Winston | winston@leetcode.com |
3 | Annabelle | bella-@leetcode.com |
4 | Sally | sally.come@leetcode.com |
解析
本題的核心在於確定有效表示式的匹配規則, 並寫出相應的正規表示式。值得一提的是,在pandas庫中自帶match()
方法支援正規表示式匹配, 無需import re
正規表示式由三部分組成,即字首、主題和域名
- 字首以字母開頭, 即
^[a-zA-Z]
- 主體可以包含字母, 數字,
'_'
,'.'
,'—'
, 即[a-zA-Z0-9_.—]
- 域名為
leetcode@\.com$
,\.
需要使用反斜槓轉義, 在python3.7及以上版本中@
無需轉義
程式碼如下:
import pandas as pd
def valid_emails(users: pd.DataFrame) -> pd.DataFrame:
mails = users[users["mail"].str.match(r"^[a-zA-Z][a-zA-Z0-9_.-]*@leetcode\.com$")]
return mails
在表示式前應加r
表示只讀,防止某些字元被轉義
此外,Dataframe
中的字元型資料以varchar
儲存,處理時應先轉換為str
例項