最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python利用正則表達(dá)式進(jìn)行數(shù)據(jù)校驗(yàn)詳解

 更新時(shí)間:2025年12月17日 08:14:46   作者:detayun  
在我們的日常編程工作中,尤其是在處理用戶輸入或外部數(shù)據(jù)時(shí),一個(gè)至關(guān)重要的環(huán)節(jié)就是數(shù)據(jù)校驗(yàn),下面我們就來看看Python如何使用正則表達(dá)式進(jìn)行數(shù)據(jù)校驗(yàn)吧

在我們的日常編程工作中,尤其是在處理用戶輸入或外部數(shù)據(jù)時(shí),一個(gè)至關(guān)重要的環(huán)節(jié)就是數(shù)據(jù)校驗(yàn)。

想象一下這些場景:

  • 用戶注冊時(shí),你需要確保他輸入的是一個(gè)格式正確的郵箱地址。
  • 用戶填寫個(gè)人信息時(shí),你需要驗(yàn)證他的手機(jī)號(hào)是否有效。
  • 你從網(wǎng)上爬取數(shù)據(jù),需要從一堆雜亂的文本中篩選出身份證號(hào)碼。

如果靠手動(dòng)寫一堆 if/else 和字符串判斷,代碼會(huì)變得冗長、復(fù)雜且容易出錯(cuò)。今天,我們就來看看如何用Python的“神器”——正則表達(dá)式,來優(yōu)雅、高效地解決這些數(shù)據(jù)校驗(yàn)問題。

為什么選擇正則表達(dá)式做校驗(yàn)

簡單來說,正則表達(dá)式就是一個(gè)描述文本模式的模板。對于數(shù)據(jù)校驗(yàn),它有三大優(yōu)勢:

  • 精確:可以定義非常復(fù)雜和精確的規(guī)則,比如“以字母開頭,包含6到12位字母、數(shù)字和下劃線”。
  • 高效:底層由C語言實(shí)現(xiàn),匹配速度遠(yuǎn)超我們自己寫的Python循環(huán)和判斷。
  • 通用:一旦學(xué)會(huì),不僅在Python中,你在JavaScript、Java、Shell腳本等幾乎所有環(huán)境中都能使用它。

數(shù)據(jù)校驗(yàn)的核心:re.match()與re.fullmatch()

在數(shù)據(jù)校驗(yàn)中,我們通常關(guān)心的是整個(gè)字符串是否符合某個(gè)模式,而不是僅僅在字符串中找到一個(gè)匹配項(xiàng)。因此,re.match()re.fullmatch() 是我們的首選。

  • re.match(pattern, string): 從字符串的開頭開始匹配。如果模式只匹配了字符串的一部分,它也會(huì)成功,這有時(shí)會(huì)導(dǎo)致隱藏的bug。
  • re.fullmatch(pattern, string): (推薦) 嘗試將整個(gè)字符串與模式進(jìn)行匹配。只有完全匹配時(shí)才會(huì)成功,這正是我們做數(shù)據(jù)校驗(yàn)時(shí)最需要的功能!

它們都會(huì)返回一個(gè)“匹配對象”(表示成功)或 None(表示失敗)。我們通常這樣使用:

import re

if re.fullmatch(pattern, data_to_check):
    print("校驗(yàn)通過!")
else:
    print("校驗(yàn)失?。?)

實(shí)戰(zhàn)演練:常見數(shù)據(jù)校驗(yàn)案例

讓我們直接上手,解決幾個(gè)最常見的數(shù)據(jù)校驗(yàn)需求。

案例一:校驗(yàn)電子郵箱(Email)

一個(gè)郵箱地址通常由 用戶名@域名.頂級域名 構(gòu)成。

  • 用戶名:可以包含字母、數(shù)字、下劃線 _、點(diǎn) . 和減號(hào) -。
  • 域名:與用戶名類似。
  • 頂級域名:通常是2個(gè)或更多字母,如 .com, .org, .io。

根據(jù)這個(gè)規(guī)則,我們可以構(gòu)建如下的正則表達(dá)式:

import re

def validate_email(email):
    # ^                  - 字符串開頭
    # [a-zA-Z0-9._%+-]+  - 用戶名部分:至少一個(gè)字母、數(shù)字或特殊符號(hào)
    # @                  - @ 符號(hào)
    # [a-zA-Z0-9.-]+     - 域名部分:至少一個(gè)字母、數(shù)字或點(diǎn)/減號(hào)
    # \.                 - 一個(gè)真正的點(diǎn) .
    # [a-zA-Z]{2,}       - 頂級域名:至少兩個(gè)字母
    # $                  - 字符串結(jié)尾
    pattern = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
    
    if re.fullmatch(pattern, email):
        return True
    return False

# --- 測試 ---
print(f"'test.email@example.com' 是有效的嗎? {validate_email('test.email@example.com')}")
print(f"'invalid-email@.com' 是有效的嗎? {validate_email('invalid-email@.com')}")
print(f"'just-a-string' 是有效的嗎? {validate_email('just-a-string')}")

輸出

'test.email@example.com' 是有效的嗎? True
'invalid-email@.com' 是有效的嗎? False
'just-a-string' 是有效的嗎? False

看,一個(gè)復(fù)雜的郵箱校驗(yàn)就這樣輕松搞定了!

案例二:校驗(yàn)中國大陸手機(jī)號(hào)

目前,中國大陸的手機(jī)號(hào)通常是11位數(shù)字,并且以特定的號(hào)段開頭(如13x, 15x, 18x, 19x等)。為了簡化,我們只校驗(yàn)“以1開頭,后面跟10位數(shù)字”這個(gè)基本規(guī)則。

import re

def validate_phone_number(phone):
    # ^1     - 必須以 1 開頭
    # \d{10} - 后面必須是 10 個(gè)數(shù)字
    # $      - 到字符串結(jié)尾
    pattern = r"^1\d{10}$"
    
    if re.fullmatch(pattern, phone):
        return True
    return False

# --- 測試 ---
print(f"'13812345678' 是有效的嗎? {validate_phone_number('13812345678')}")
print(f"'12345678901' 是有效的嗎? {validate_phone_number('12345678901')}") # 不以1開頭
print(f"'1381234abcd' 是有效的嗎? {validate_phone_number('1381234abcd')}") # 包含非數(shù)字

輸出

'13812345678' 是有效的嗎? True
'12345678901' 是有效的嗎? False
'1381234abcd' 是有效的嗎? False

這個(gè)校驗(yàn)器可以快速過濾掉明顯格式錯(cuò)誤的手機(jī)號(hào)。

案例三:校驗(yàn)用戶名(中等復(fù)雜度)

假設(shè)我們要求用戶名必須:

  • 以字母開頭。
  • 只能包含字母、數(shù)字和下劃線。
  • 長度在6到12個(gè)字符之間。

我們可以將這些規(guī)則組合起來:

import re

def validate_username(username):
    # ^          - 字符串開頭
    # [a-zA-Z]   - 必須以一個(gè)字母開頭
    # [a-zA-Z0-9_]{5,11} - 后面跟著5到11個(gè)字母、數(shù)字或下劃線
    # $          - 字符串結(jié)尾
    # 總長度就是 1 + (5到11) = 6到12
    pattern = r"^[a-zA-Z][a-zA-Z0-9_]{5,11}$"
    
    if re.fullmatch(pattern, username):
        return True
    return False

# --- 測試 ---
print(f"'user_123' 是有效的嗎? {validate_username('user_123')}")
print(f"'123user' 是有效的嗎? {validate_username('123user')}") # 不以字母開頭
print(f"'u' 是有效的嗎? {validate_username('u')}") # 太短
print(f"'this_is_a_very_long_name' 是有效的嗎? {validate_username('this_is_a_very_long_name')}") # 太長

輸出

'user_123' 是有效的嗎? True
'123user' 是有效的嗎? False
'u' 是有效的嗎? False
'this_is_a_very_long_name' 是有效的嗎? False

通過組合不同的元字符,我們可以輕松實(shí)現(xiàn)各種復(fù)雜的組合校驗(yàn)規(guī)則。

總結(jié)與最佳實(shí)踐

  • 校驗(yàn)首選 re.fullmatch():因?yàn)樗笳麄€(gè)字符串都匹配模式,最符合“校驗(yàn)”的定義。
  • 使用原始字符串 r"":在定義正則表達(dá)式模式時(shí),總是在字符串前加上 r。這可以防止反斜杠 \ 被Python解釋為轉(zhuǎn)義字符,避免很多不必要的麻煩。
  • 從簡單開始:先構(gòu)建一個(gè)能滿足基本需求的簡單模式,然后逐步增加復(fù)雜性。

正則表達(dá)式是處理文本和數(shù)據(jù)的超級工具。雖然初學(xué)時(shí)可能會(huì)覺得有些晦澀,但一旦你掌握了它,就會(huì)發(fā)現(xiàn)它在數(shù)據(jù)清洗、驗(yàn)證和提取方面無與倫比的威力。把它加入你的技能庫,你的代碼一定會(huì)變得更強(qiáng)大、更健壯!

到此這篇關(guān)于Python利用正則表達(dá)式進(jìn)行數(shù)據(jù)校驗(yàn)詳解的文章就介紹到這了,更多相關(guān)Python正則表達(dá)式數(shù)據(jù)校驗(yàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 8個(gè)讓Python代碼效率翻倍的簡單技巧

    8個(gè)讓Python代碼效率翻倍的簡單技巧

    這篇文章主要為大家詳細(xì)介紹了8個(gè)讓Python代碼效率翻倍的簡單技巧,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以參考一下
    2026-01-01
  • 從基礎(chǔ)到高級詳解Python實(shí)現(xiàn)隨機(jī)選擇功能的完全指南

    從基礎(chǔ)到高級詳解Python實(shí)現(xiàn)隨機(jī)選擇功能的完全指南

    在數(shù)據(jù)科學(xué)、算法設(shè)計(jì)和系統(tǒng)開發(fā)中,隨機(jī)選擇是至關(guān)重要的核心技術(shù),Python提供了全面的隨機(jī)選擇工具集,下面小編就來和大家詳細(xì)介紹一下吧
    2025-08-08
  • python將字典內(nèi)容存入mysql實(shí)例代碼

    python將字典內(nèi)容存入mysql實(shí)例代碼

    這篇文章主要介紹了python將字典內(nèi)容存入mysql實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • python使用matplotlib畫出的圖怎樣放到word中

    python使用matplotlib畫出的圖怎樣放到word中

    這篇文章主要介紹了python使用matplotlib畫出的圖怎樣放到word中問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 如何構(gòu)建第二個(gè)Django的應(yīng)用程序

    如何構(gòu)建第二個(gè)Django的應(yīng)用程序

    這篇文章主要介紹了如何構(gòu)建第二個(gè)Django的應(yīng)用程序問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • pyqt5 QScrollArea設(shè)置在自定義側(cè)(任何位置)

    pyqt5 QScrollArea設(shè)置在自定義側(cè)(任何位置)

    這篇文章主要介紹了pyqt5 QScrollArea設(shè)置在自定義側(cè)(任何位置),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 對Python生成器、裝飾器、遞歸的使用詳解

    對Python生成器、裝飾器、遞歸的使用詳解

    今天小編就為大家分享一篇對Python生成器、裝飾器、遞歸的使用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python列表的索引與切片

    Python列表的索引與切片

    這篇文章主要介紹了Python列表的索引與切片,索引用來對單個(gè)成員(元素)進(jìn)行訪問,切片則是對一定范圍內(nèi)的成員(元素)進(jìn)行訪問。下文相關(guān)自來需要的小伙伴可以參考一下
    2022-04-04
  • OpenCV?Python身份證信息識(shí)別過程詳解

    OpenCV?Python身份證信息識(shí)別過程詳解

    本篇文章使用OpenCV-Python和CnOcr來實(shí)現(xiàn)身份證信息識(shí)別的案例,本篇文章使用的Python版本為3.6,OpenCV-Python版本為3.4.1.15,如果是4.x版本的同學(xué),可能會(huì)有一些Api操作不同,下面跟隨小編看下OpenCV?Python身份證信息識(shí)別過程
    2022-04-04
  • python實(shí)現(xiàn)GATK多線程加速示例

    python實(shí)現(xiàn)GATK多線程加速示例

    這篇文章主要為大家介紹了python實(shí)現(xiàn)GATK多線程加速示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07

最新評論

油尖旺区| 大姚县| 西城区| 西宁市| 饶平县| 垦利县| 镇安县| 麦盖提县| 温州市| 韶关市| 岳池县| 元氏县| 连平县| 大悟县| 平舆县| 信宜市| 云霄县| 宝应县| 博野县| 扎鲁特旗| 菏泽市| 南乐县| 砀山县| 江口县| 天等县| 新绛县| 郓城县| 泸西县| 新郑市| 高陵县| 开平市| 思茅市| 峡江县| 凤山县| 福州市| 贺兰县| 黄石市| 邢台县| 江阴市| 安多县| 新民市|