Python語法進階(2)- 正規表示式

葛老頭發表於2022-02-23

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 ,top
 1 # 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程式設計

 

相關文章