1.初識正規表示式
1.1.什麼是正規表示式
正規表示式是一個特殊的字元序列,便於檢查一個字串是否與某種模式匹配;應用於字串,在字串中通過複雜的過濾篩選等操作得到我們想要的資料;
正規表示式的特點 :
- 正規表示式的語法太多,可讀性差
- 正規表示式通用行很強,能夠適用於很多程式語言
1.2.正規表示式的使用場景
在實際開發過程中經常會有查詢符合某些複雜規則的字串的需要,比如:手機號、郵箱、圖片地址 等,這時候想匹配或者查詢符合某些規則的字串就可以使用正規表示式了。
1.3.正規表示式模組re的用法
匹配字串需要的條件:
- 正規表示式模組--re
- 匹配查詢的規則
- 被查詢的字串
2.正規表示式的字元匹配
1 # coding:utf-8 2 3 import re 4 5 #將字串中的數字提取出來 6 def had_number(data): 7 result=re.findall('\d',data) 8 print(result) #['3', '3', '1', '7', '5'] 9 for i in result: 10 return True 11 return False 12 13 #去掉字串中的數字 14 def remove_number(data): 15 result=re.findall('\D',data) 16 print(result) #['m', 'y', ' ', 'n', 'a', 'm', 'e', ' ', 'i', 's', ' ', 'z', 'h', 'a', 'n', 'g', 's', 'a', 'n', ',', 'm', 'y', ' ', 'a', 'g', 'e', ' ', ',', 't', 'o', 'p', ' '] 17 return ''.join(result) 18 19 if __name__=='__main__': 20 data='my name is zhangsan,my age 33,top 175' 21 result=had_number(data) 22 print(result) #True 23 result=remove_number(data) 24 print(result) #my name is zhangsan,my age ,top1 # coding:utf-8 2 3 import re 4 5 #判斷字串以什麼開頭 6 def startswith(sub,data): 7 _sub='\A%s' % sub 8 result=re.findall(_sub,data) 9 for i in result: 10 return True 11 return False 12 13 #判斷字串以什麼結尾 14 def endswith(sub,data): 15 _sub='%s\Z' % sub 16 result=re.findall(_sub,data) 17 if len(result) != 0: 18 return True 19 else: 20 return False 21 22 #判斷字串真實的長度 23 def real_len(data): 24 result=re.findall('\S',data) 25 print(result) #['m', 'y', 'n', 'a', 'm', 'e', 'i', 's', 'z', 'h', 'a', 'n', 'g', 's', 'a', 'n', ',', 'm', 'y', 'a', 'g', 'e', '3', '3', ',', 't', 'o', 'p', '1', '7', '5'] 26 return len(result) 27 28 if __name__=='__main__': 29 data='my name is zhangsan,my age 33,top 175' 30 #startswith 31 result=startswith('my',data) 32 result1=startswith('myw',data) 33 print(result) #True 34 print(result1) #False 35 #endswith 36 result2=endswith('75',data) 37 result3=endswith('000',data) 38 print(result2) #True 39 print(result3) #False 40 #real_len 41 result4=real_len(data) 42 print(len(data)) #37 43 print(result4) #31
3.正規表示式的量詞
4.正則的綜合練習
1 # coding:utf-8 2 import re 3 4 #網址匹配 5 def check_url(url): 6 result=re.findall('[a-zA-Z]{4,5}://\w*\.*\w+\.\w+',url) 7 if len(result) !=0 : 8 return True 9 else: 10 return False 11 #獲取網址,通過組()獲取我們過濾出來的資訊 12 def get_url(url): 13 result = re.findall('http[a-zA-Z]*://(\w*\.*\w+\.\w+)', url) 14 if len(result) !=0: 15 return result[0] 16 else: 17 return '' 18 19 #檢驗郵箱是否正確 20 def get_email(data): 21 result=re.findall('.+@.+\.[a-zA-Z]+',data) 22 return result 23 24 #獲取網頁style屬性資訊 25 def get_html_data(data): 26 result=re.findall('style="(.*?)"',data) #?的作用:例子中篩選規則結尾的雙引號找到一次就結束,而不是貪婪的找到最後一個雙引號 27 return result 28 29 #獲取網頁所有屬性的值 30 def get_all_data_html(data): 31 result=re.findall('="(.+?)"',data) 32 return result 33 34 if __name__=='__main__': 35 url = 'http://www.baidu.com' 36 emails='zhangsan@qq.com' 37 html = ('<div class="s-top-nav" style="display:none;">' 38 '</div><div class="s-center-box"></div>') 39 print(check_url(url)) #True 40 print(get_url(url)) #www.baidu.com 41 print(get_email(emails)) #['zhangsan@qq.com'] 42 print(get_html_data(html)) #['display:none;'] 43 print(get_all_data_html(html)) #['s-top-nav', 'display:none;', 's-center-box']
5.正規表示式的re模組
5.1.findall()的使用
5.2.search()的使用
5.3.group()與groups()的使用
跟search()配合使用,search返回匹配物件;group/groups讀取組的序列是從1開始
5.4.split()正則替換
根據正則規則對字串進行切割
\W字元數字以外的字元,相當於根據圖示字串中的空格作為匹配規則,進行切割
5.5.compile的使用
5.6.match的使用
match只會匹配字串從頭開始的資訊,match返回的匹配物件也可以通過group進行呼叫
5.7.re的額外匹配要求
1 # coding:utf-8 2 3 import re 4 5 def check_url(url): 6 re_g = re.compile('[a-zA-Z]{4,5}://\w*\.*\w+\.\w+') 7 print(re_g) #re.compile('[a-zA-Z]{4,5}://\\w*\\.*\\w+\\.\\w+') 8 result = re_g.findall(url) 9 if len(result) != 0: 10 return True 11 else: 12 return False 13 14 def get_url(url): 15 re_g = re.compile('[https://|http://](\w*\.*\w+\.\w+)') 16 result = re_g.findall(url) 17 if len(result) != 0: 18 return result[0] 19 else: 20 return '' 21 22 23 def get_email(data): 24 re_g = re.compile('.+@.+\.[a-zA-Z]+') 25 result = re_g.findall(data) 26 return result 27 28 29 html = ('<div class="s-top-nav" style="display:none;">' 30 '</div><div class="s-center-box"></div>') 31 32 33 def get_html_data(data): 34 re_g = re.compile('style="(.*?)"') 35 result = re_g.findall(data) 36 return result 37 38 def get_all_data_html(data): 39 re_g = re.compile('="(.+?)"') 40 result = re_g.findall(data) 41 return result 42 43 44 if __name__ == '__main__': 45 result = check_url('http://www.baidu.com/') 46 print(result) #True 47 result = get_url('https://www.baidu.com/') 48 print(result, 'get_url') #www.baidu.com get_url 49 result = get_email('dewei@123.net') 50 print(result) #['dewei@123.net'] 51 result = get_html_data(html) 52 print(result) #['display:none;'] 53 result = get_all_data_html(html) 54 print(result) #['s-top-nav', 'display:none;', 's-center-box'] 55 re_g = re.compile(('<div class="(.*?)" style="(.*?)">' 56 '</div><div class="(.*?)"></div>')) 57 result = re_g.search(html) 58 print(result.groups()) #('s-top-nav', 'display:none;', 's-center-box') 59 print(result.group(1)) #s-top-nav 60 print(result.group(2)) #display:none; 61 print(result.group(3)) #s-center-box 62 # print(result.group(4)) 63 re_g = re.compile('\s') 64 result = re_g.split(html) 65 print(result) #['<div', 'class="s-top-nav"', 'style="display:none;"></div><div', 'class="s-center-box"></div>'] 66 67 re_g = re.compile('<div class="(.*?)"') 68 result = re_g.match(html) 69 print(result.span()) #正則物件.span()返回物件的序列範圍,(0, 22) 70 print(html[: 22]) #<div class="s-top-nav"
6.Python常見匹配案例
6.1.匹配1-100之間的數
1 import re 2 3 s = '100' # 1-100內的任意數字 4 ret = re.match(r'(100|[1-9]\d{0,1})$', s) 5 print(ret.group()) 6 # 執行結果: 7 # 100
6.2.匹配座機號碼
1 import re 2 3 s = "010-12345678" 4 ret = re.search(r'^\d{3,4}-\d{7,8}$', s) 5 print(ret.group()) 6 # 執行結果: 7 # 010-12345678
6.3.匹配5-10位純數字組成的qq號碼,且不能以0開頭
1 import re 2 3 s = "11010" 4 ret = re.match(r'[1-9]\d{4,9}$', s) 5 if ret != None: 6 print(ret.group()) 7 else: 8 print('匹配失敗!') 9 # 執行結果: 10 # 11010
6.4.取出字串中的所有字母
1 import re 2 3 s = "43arwer32656fafa6546jjuy#H" 4 res = re.compile(r'[a-zA-Z]+') 5 ret = res.findall(s) 6 print(ret) 7 # 執行結果: 8 # ['arwer', 'fafa', 'jjuy', 'H']
6.5.找出以字母y結尾的單詞,忽略大小寫
1 import re 2 3 s = 'study hard and make progress every day' 4 res = re.compile(r'\w+y\b', re.I) # \b為邊界 5 ret = res.findall(s) 6 print(ret) 7 # 執行結果: 8 # ['study', 'every', 'day']
6.6.將多個重複的字母替換成&
1 import re 2 3 s = "PythondddJavauuuHTMLFFPHP" 4 res = re.compile(r'([a-zA-Z])\1+') 5 ret = res.sub('&', s) 6 print(ret) 7 # 執行結果: 8 # Python&Java&HTML&PHP
6.7.將字串變成 '我要學Python程式設計
1 import re 2 3 s = "我我...我我...我要..要要...要要...學學學...學學..Python...編編編..程式設計..程.程...程...程" 4 res = re.sub(r'\W+', '', s) 5 ret = re.sub(r'(.)\1+', r'\1', res) 6 print(ret) 7 # 執行結果: 8 # 我要學Python程式設計