- Python入門很輕松(微課超值版)
- 云尚科技
- 2048字
- 2020-09-01 15:58:04
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的程序運行結果
- Learning Single:page Web Application Development
- C#高級編程(第10版) C# 6 & .NET Core 1.0 (.NET開發經典名著)
- Mastering Concurrency in Go
- Getting Started with CreateJS
- Python應用輕松入門
- GameMaker Programming By Example
- 精通Python自然語言處理
- 實戰Java高并發程序設計(第3版)
- Kinect for Windows SDK Programming Guide
- 計算機應用基礎教程(Windows 7+Office 2010)
- Learning AWS
- Python 3 數據分析與機器學習實戰
- 大數據時代的企業升級之道(全3冊)
- Machine Learning for OpenCV
- 你真的會寫代碼嗎