re正則表達式

re模塊

re又名正則表達式,是一種小型語言,其做用範圍爲字符串,內嵌在python中,經過調用re模塊實現,其底層經過C語言編寫的匹配法則進行匹配python

做用目的:經過編寫的匹配規則對字符串進行模糊匹配,比字符串內置方法更爲強大,字符串內置方法只能進行精準匹配正則表達式

元字符

字符分爲普通字符與元字符, 經過元字符的組合能夠達到模糊匹配的規則ide

普通字符沒有特殊功能, 能夠跟自身進行匹配函數

元字符: . * ^ $ + ? {} \ []spa

注意:元字符匹配都屬於貪婪匹配,即最屢次匹配3d

具體用法: ".",通配符, 能夠代指全部內容, 但換行符\n除外, 且一個.只能代指一個字符code

字符:   "*",跟在一個字符後面, 用以表示能夠重複前面字符的次數,   範圍[0,正無窮]對象

   "+",跟在字符後面,相似" * ",但範圍爲[1,正無窮)blog

   "?" 跟在字符後邊,相似" * ",但範圍爲[0,1]字符串

   "{}" 跟在字符後面,也是重複匹配, 但能夠定義匹配次數或匹配範圍

   "^"  寫在規則前面, 表示從第一個字符開始匹配

   "$" 寫在規則後面, 表示從後面開始匹配

import re
print(re.findall("t.m","oqqoqjqtomqoq"))        #表示匹配以t開頭以m結尾中間能夠是任意一個字符串且連在一塊兒的一個字符串

print(re.findall("to*","qoqotoooooalkjqljq"))  #匹配以t開頭後面跟o字符且o字符個數範圍能夠爲0-無窮多個

print(re.findall("to+","qjkqjtoooajjk"))        #匹配以t開頭且後面跟o字符且o字符個數範圍能夠爲1—無窮多個

print(re.findall("to?","qoqotooamla"))           #匹配以t開頭且後面跟o字符且o字符個數範圍爲0-1個

print(re.findall("to{2}","qoqqotooomlqj"))       #匹配以t開頭且後面跟o字符且o字符個數爲兩個

print(re.findall("^to","tomakjajl"))              #匹配以to開頭的字符串

print(re.findall("to$","akjqqiqoto"))             #匹配以to結尾的字符串

元字符之字符集[]

字符集用[]表示

做用:1.或的用法 2.取消元字符的特殊功能("\" ,"^","-"除外)3.[^]取反,即至關於去除掉[]中的內容

1 import re
2 print(re.findall("[ab]","qqjqajkjkbqijqabkk;"))#['a', 'b', 'a', 'b']    對[]中單個字符進行或的匹配
1 print(re.findall("[^abc]","qoqoazbfjk"))#['q', 'o', 'q', 'o', 'z', 'f', 'j', 'k']   去除掉掉a,b,c,

元字符之轉譯符"\"

用法:1.反斜槓後邊跟元字符去除特殊功能

        2.反斜槓後邊跟普通字符實現特殊功能

經常使用功能:

  \d:匹配任何十進制數,  至關於類[0-9]

  \D:匹配任何非數字字符, 至關於類[^0-9]

  \s:匹配任何空白字符,至關於類[\t\n\r\f\v]

  \S:匹配任何非空白字符, 跟\s結果相反

  \w:匹配任何字母數字字符, 至關於[a-zA-Z0-9]

  \W:配任何非數字字母字符至關於[^a-zA-Z0-9]

  \b:匹配特殊字符邊界, 如@,空格,#等

import re
print(re.findall("\d","ajkaja12324akjk"))
#['1', '2', '3', '2', '4']
print(re.findall("\D","ajqjq123jlkajfakoi473"))
#['a', 'j', 'q', 'j', 'q', 'j', 'l', 'k', 'a', 'j', 'f', 'a', 'k', 'o', 'i']
print(re.findall("\s","akjfak akq  akjfkj"))
#[' ', ' ', ' ']
print(re.findall("\S","akjfakj cfjak akjf"))
#['a', 'k', 'j', 'f', 'a', 'k', 'j', 'c', 'f', 'j', 'a', 'k', 'a', 'k', 'j', 'f']
print(re.findall("\w","qjjqkj12324jfjaj.afja qjj"))
#['q', 'j', 'j', 'q', 'k', 'j', '1', '2', '3', '2', '4', 'j', 'f', 'j', 'a', 'j', 'a', 'f', 'j', 'a', 'q', 'j', 'j']
print(re.findall("\W","qkjq?qjk\qkj"))
#['?', '\\']                  #注意,這裏之因此會匹配到兩個\\,後面會說到

因爲python解釋器對\也有轉譯功能,當咱們用正則匹配的時候,先是將命令交給python解釋器,而後python解釋器再將命令傳遞給re模塊,返回一樣道理,但因爲\在python解釋器這一層也有轉譯功能,因此在還沒傳遞到re模塊時候,命令已經按照python解釋器這一層方法進行轉譯了,因此若是咱們想讓python解釋器將命令原封不動的傳遞給re模塊處理,在匹配規則前面加上r,或者在\前面加\,在python這一層處理完傳遞到re模塊就剩一個\了(建議在使用規則,前加上r)

元字符之分組 ()

無名分組:

1 import re
2 m = re.findall(r'(ad)+', 'add')         #()至關於將ad當作一個元素進行匹配
3 print(m)#['ad']

有名分組: 格式(?P<name>規則)

1 import re
2 res = re.search("(?P<name>\d+)","jfaj123jlkjfa").group("name")#search查找的結果是一組對象,能夠用.group取出結果

3 print(res)#123

re模塊下經常使用方法

 1 import re
 2 #1
 3 re.findall('a','alvin yuan')    #返回全部知足匹配條件的結果,放在列表裏
 4 #2
 5 re.search('a','alvin yuan').group()  #函數會在字符串內查找模式匹配,只到找到第一個匹配而後返回一個包含匹配信息的對象,該對象能夠
 6                                      # 經過調用group()方法獲得匹配的字符串,若是字符串沒有匹配,則返回None。
 7  
 8 #3
 9 re.match('a','abc').group()     #同search,不過盡在字符串開始處進行匹配
10  
11 #4
12 ret=re.split('[ab]','abcd')     #先按'a'分割獲得''和'bcd',在對''和'bcd'分別按'b'分割
13 print(ret)#['', '', 'cd']
14  
15 #5
16 ret=re.sub('\d','abc','alvin5yuan6',1)
17 print(ret)#alvinabcyuan6
18 ret=re.subn('\d','abc','alvin5yuan6')
19 print(ret)#('alvinabcyuanabc', 2)
20  
21 #6
22 obj=re.compile('\d{3}')
23 ret=obj.search('abc123eeee')
24 print(ret.group())#123
25 1
26 2
27 3
28 4
29 5
30 6
31 import re
32 ret=re.finditer('\d','ds3sy4784a')
33 print(ret)        #<callable_iterator object at 0x10195f940>
34  
35 print(next(ret).group())
36 print(next(ret).group())
re

注意:在有分組元字符()存在時,findall會優先把匹配結果組裏內容返回,若是想要匹配結果,取消權限便可,格式(?:規則)

相關文章
相關標籤/搜索