你能一眼判斷手機(jī)號(hào)、郵箱、身份證號(hào)是否正確嗎?Python 幫你搞定!
當(dāng)你做表單校驗(yàn)、注冊(cè)驗(yàn)證、數(shù)據(jù)清洗的時(shí)候,是不是經(jīng)常會(huì)碰到這些問(wèn)題?
- 這是個(gè)合法手機(jī)號(hào)嗎?
- 郵箱地址格式對(duì)不對(duì)?
- 身份證號(hào)碼能用嗎?
今天就來(lái)給大家封裝一組超實(shí)用的 格式校驗(yàn)工具函數(shù),搞定這 3 個(gè)高頻驗(yàn)證需求!
目標(biāo)功能
校驗(yàn)類型 | 支持說(shuō)明 |
手機(jī)號(hào) | 支持中國(guó)大陸 11 位手機(jī)號(hào)格式 |
身份證號(hào) | 支持 18 位中國(guó)身份證校驗(yàn)(支持校驗(yàn)碼) |
郵箱地址 | 常規(guī)郵箱格式校驗(yàn)(包含常見(jiàn)特殊字符) |
原理:正則表達(dá)式(re 模塊)
Python 自帶的 re 模塊可以實(shí)現(xiàn)強(qiáng)大的模式匹配,校驗(yàn)格式是它的強(qiáng)項(xiàng)。只需幾行代碼,就能輕松搞定你想要的規(guī)則校驗(yàn)。
工具函數(shù)封裝
import re
def is_valid_phone(phone: str) -> bool:
"""
判斷是否為合法的中國(guó)大陸手機(jī)號(hào)(以1開(kāi)頭,11位數(shù)字)
"""
return re.fullmatch(r"1[3-9]\d{9}", phone) is not None
def is_valid_email(email: str) -> bool:
"""
判斷是否為合法郵箱地址
"""
return re.fullmatch(r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+", email) is not None
def is_valid_id_card(id_card: str) -> bool:
"""
判斷是否為合法身份證號(hào)(18位,支持校驗(yàn)碼X/x,區(qū)號(hào)生日等不在檢測(cè)范圍,要好好學(xué)習(xí))
"""
return re.fullmatch(r"\d{17}[\dXx]", id_card) is not None
示例使用
if __name__ == "__main__":
print(is_valid_phone("13812345678")) # ? True
print(is_valid_email("test.email+100@domain.com")) # ? True
print(is_valid_id_card("110101199003071234")) # ? True
錯(cuò)誤示例測(cè)試
print(is_valid_phone("123456")) # ? False
print(is_valid_email("bad-email@")) # ? False
print(is_valid_id_card("abcdefg1234567890x")) # ? False
拓展建議
- 進(jìn)一步校驗(yàn)身份證號(hào)碼中的出生日期是否合法
- 郵箱是否屬于特定域名(如僅允許 @qq.com)
- 手機(jī)號(hào)是否真實(shí)存在(接入運(yùn)營(yíng)商三要素 API)
總結(jié)一句話
不要再手寫(xiě) if 判斷啦!用正則表達(dá)式封裝好校驗(yàn)函數(shù),調(diào)用方便、邏輯清晰、擴(kuò)展簡(jiǎn)單!