官术网_书友最值得收藏!

5.3 正則表達式和re模塊

微視頻

正則表達式是字符串,它包含文本和特殊字符。re模塊可以執行正則表達式的功能。利用文字與特定字符的混合,可以定義復雜的字符串匹配與取代類型。

5.3.1 正則表達式的特定字符

正則表達式所用的特定字符如表5-2所示。

表5-2 正則表達式所用的特定字符

如果用戶要在正則表達式內使用?、*、+或換行等符號,就必須使用表5-3所示的字符。

表5-3 正則表達式內的特殊字符

5.3.2 re模塊的方法

re模塊的主要功能是通過正則表達式來操作字符串。在使用re模塊時,需要先使用import語句引入,語法格式如下:

    import re

下面講述re模塊中常見的操作字符串的方法。

1.匹配字符串

通過re模塊中的match()、search()和findall()方法可以匹配字符串。

(1)match()。match()方法用于從字符串的開始處進行匹配,如果在起始位置匹配成功,則返回Match對象;如果不是在起始位置匹配成功,則返回None。

match()方法的語法格式如下:

    re.match(pattern, string, flags=0)

其中,參數pattern用于匹配的正則表達式;參數string用于要匹配的字符串;參數flags用于控制正則表達式的匹配方式,如是否區分大小寫、多行匹配等。如果匹配成功,match()方法返回一個匹配的對象,否則返回None。

【例5.5】驗證輸入的手機號是否為中國移動的號碼(源代碼\ch05\5.5.py)。

這里首先需要導入re模塊,然后定義一個驗證手機號碼的模式字符串,最后使用match()方法驗證輸入的手機號是否和模式字符串匹配。

    import re                                    #導入Python 的re 模塊
    print("歡迎進入中國移動電話號碼驗證系統")
    s1 = r'(13[4-9]\d{8})$|(15[01289]\d{8}$)'
    s2 = input("請輸入需要驗證的電話號碼:")     #輸入需要驗證的電話號碼
    match = re.match(s1,s2)                      #進行模式匹配
    if match==None:                              #判斷是否為None,為真表示匹配失敗
       print("您輸入的號碼不是中國移動的電話")
    else:
       print("您輸入的號碼是中國移動的電話")

程序運行結果如圖5-5所示。

圖5-5 例5.5的程序運行結果

(2)search()。search()方法用于掃描整個字符串并返回第一個成功的匹配。語法格式如下:

    re.search(pattern, string, flags=0)

其中,參數pattern用于匹配的正則表達式;參數string用于要匹配的字符串;參數flags用于控制正則表達式的匹配方式,如是否區分大小寫、多行匹配等。如果匹配成功,match()方法返回一個匹配的對象,否則返回None。

與match()方法不同的是,search()方法既可以在起始位置匹配,也可以不在起始位置匹配。

例如下面的代碼:

    import re
    print(re.search('www', 'www.bczj123.com').span())  #在起始位置匹配
    print(re.search('123', 'www.bczj123.com').span())  #不在起始位置匹配

運行結果如下:

    (0, 3)
    (8, 11)

【例5.6】敏感字過濾系統(源代碼\ch05\5.6.py)。

假設敏感字為滲透、攻擊、腳本,如果輸入的字符串中含有敏感字中的任意一個,將會有警告提示,否則安全通過。

    import re                                         #導入Python 的re 模塊
    print("歡迎進入敏感字過濾系統")
    s1 = r'(滲透)|(攻擊)|(腳本)'                      #模式字符串
    s2 = input("請輸入需要驗證的文字:")              #輸入需要驗證的字符串
    match = re.search(s1,s2)                          #進行模式匹配
    if match==None:                                   #判斷是否為None,為真表示匹配失敗
       print("您輸入的文字安全通過!!")
    else:
       print("警告!您輸入的文字存在敏感字,請重新整理后輸入!")

程序運行結果如圖5-6所示。

圖5-6 例5.6的程序運行結果

大牛提醒

match()方法只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而search()方法匹配整個字符串,直到找到一個匹配項。

(3)findall()。findall()方法用于在字符串中找到正則表達式所匹配的所有子串,并返回一個列表,如果沒有找到匹配項,則返回空列表。

大牛提醒

match()和search()方法是匹配一次,而findall()方法匹配所有。

findall()的語法格式如下:

    findall(string[, pos[, endpos]])

其中,參數string是待匹配的字符串;pos為可選參數,指定字符串的起始位置,默認為0;endpos為可選參數,指定字符串的結束位置,默認為字符串的長度。

【例5.7】數字挑選系統(源代碼\ch05\5.7.py)。

對輸入的字符串進行挑選,如果發現數字,挑選出來。

    import re                                 #導入Python 的re 模塊
    print("歡迎進入數字挑選系統")
    s1 = re.compile(r'\d+')                   #查找數字
    s2 = input("請輸入需要挑選的字符串:")    #輸入需要挑選的字符串
    result = s1.findall(s2)
    print(result)

程序運行結果如圖5-7所示。

圖5-7 例5.7的程序運行結果

2.替換字符串

通過re模塊中的sub()方法可以替換字符串中的匹配項。語法格式如下:

    re.sub(pattern, repl, string, count=0, flags=0)

其中,參數pattern是正則表達式中的模式字符串;repl是要替換的字符串,也可為一個函數;參數string要被查找替換的原始字符串;參數count是模式匹配后替換的最大次數,默認為0,表示替換所有的匹配項。

【例5.8】替換字符串中的非數字和特殊符號(源代碼\ch05\5.8.py)。

    import re
    numb = "0408-1111-1189 #這是一個學生的編號"
    #刪除字符串中的 Python 注釋
    nums = re.sub(r'#.*$', "", numb)
    print ("學生的編號是: ", nums)
    #刪除非數字(-)的字符串
    numd = re.sub(r'\D', "", numb)
    print ("學生的新編號是: ", numd)

程序運行結果如圖5-8所示。

圖5-8 例5.8的程序運行結果

3.分割字符串

通過re模塊中的split()方法可以分割字符串。split()方法按照能夠匹配的子串將字符串分割后返回列表。語法格式如下:

    re.split(pattern, string[, maxsplit=0, flags=0])

其中,參數pattern是正則表達式中的模式字符串;參數string為要被分割的字符串;參數maxsplit是分隔次數,maxsplit=1表示分隔一次,默認為0,不限制次數;參數flags用于控制正則表達式的匹配方式,如是否區分大小寫、多行匹配等。

【例5.9】使用正則表達式輸出被標星的好友(源代碼\ch05\5.9.py)。

    import re
    s1 = "*張三豐*李一真*陶淵明*李白"
    pattern = r'\*'
    ls= re.split(pattern,s1)           #以*分隔字符串
    print ("您的標星好友是:")
    for im in ls:
       if im != " ":                   #輸出不為空的元素
           print(im)                   #輸出每個好友時,去掉*符號

程序運行結果如圖5-9所示。

圖5-9 例5.9的程序運行結果

主站蜘蛛池模板: 汶川县| 城固县| 精河县| 陵川县| 平顺县| 白玉县| 乐昌市| 钟祥市| 开远市| 郧西县| 左权县| 普定县| 鄂尔多斯市| 临邑县| 雷州市| 洱源县| 留坝县| 乌海市| 扬州市| 万年县| 浑源县| 邹平县| 贵定县| 海口市| 河池市| 哈密市| 黎城县| 库尔勒市| 哈密市| 株洲市| 东山县| 新沂市| 平顺县| 达孜县| 正阳县| 皋兰县| 商洛市| 将乐县| 辽宁省| 蓝田县| 郓城县|