import re """ 使用match方法進行匹配 result = re.match(正則表達式,要匹配的字符串) 如果match匹配到數據的話,就可以使用group方法提取數據 注: 若字符串匹配正則表達式,則match方法返回匹配對象(Match Object), 否則返回None(不是空字符串) match方法是從左到右匹配(因為match的這種特性,所以 ^ 從字符串頭開始匹配 可以不用寫),匹配到不一樣的地方,match方法就結束! """
""" . :匹配任意一個字符,\n除外 [] :匹配[]中列舉的字符 \d : 數字,即0~9 \D : 非數字 \s : 空白字符,包括空格, \n , \t ,\r, 回車換行 \S :非空白字符 \w :單詞,(可以看成是校驗python變量名,實際兩者沒有任何關系,a~z , A~Z, 0~9 , _ ) \W : 非單詞字符 """
In [1]: import re In [2]: re.match('admin','good.admin') In [3]: re.match('.+','good.admin') Out[3]: <re.Match object; span=(0, 10), match='good.admin'> In [4]: re.match('.','good.admin') Out[4]: <re.Match object; span=(0, 1), match='g'> In [5]: re.match('..','good.admin') Out[5]: <re.Match object; span=(0, 2), match='go'> In [6]: re.match('.*','good.admin') Out[6]: <re.Match object; span=(0, 10), match='good.admin'>
In [7]: re.match('\w','good') Out[7]: <re.Match object; span=(0, 1), match='g'> In [8]: re.match('\w','g1') Out[8]: <re.Match object; span=(0, 1), match='g'> In [9]: re.match('\W','g1')
# \w與g匹配,但是\W與1不相匹配,所以最終還是不匹配,返回None In [10]: re.match('\w\W','g1')
""" 邊界問題 ^ : 匹配字符串開頭 $ : 匹配結尾 \b : 匹配單詞邊界 \B : 匹配非單詞邊界 """
""" 匹配數量: * : 匹配一個字符出現0次或者無限多次 + :匹配一個字符出現1次或者無限多次 ? :匹配一個字符出現0次或者1次 {m} : 匹配一個字符出現m次 {m,}: 匹配一個字符至少出現m次 {m,n} : 匹配一個字符出現m到n次 """
""" 邊界問題 ^ : 匹配字符串開頭 $ : 匹配結尾 \b : 匹配單詞邊界 \B : 匹配非單詞邊界 """
''' 示例2:匹配手機號 ''' r = re.match('1[35689]\d{9}$','13218545678') print(r) # <re.Match object; span=(0, 11), match='13218545678'> r = re.match('1[35689]\d{9}$','132185456789') print(r) #None r = re.match('1[35689]\d{9}','132185456789') # 沒有$符,無邊界問題 print(r) #<re.Match object; span=(0, 11), match='13218545678'> r = re.match('1[35689]\d{9}','13218545aaaa6789') print(r) #None
''' 示例3: 匹配單詞邊界 ''' # r:去掉轉義; ^:字符串開頭, od\b:od是單詞邊界 r = re.match(r'^\w+od\b','good') print(r) # <re.Match object; span=(0, 4), match='good'> r = re.match(r'^\w+od\b','gooder') print(r) #None r = re.match(r'^\w+\bod\b','good') print(r) #None r = re.match(r'^\w+\bod\b','jd od') print(r) #None, 因為\b只表示單詞邊界,並不表示空格 r = re.match(r'^\w+\s\bod\b','jd od') # 這里用\s去匹配了jd與od之間的空白字符 print(r) #<re.Match object; span=(0, 5), match='jd od'> r = re.match(r'^\w+od\B','gooder') print(r) #<re.Match object; span=(0, 4), match='good'> r = re.match(r'^\w+od\B','good') print(r) #None
""" 分組: | : 表示左右任意一個表達式 (ab) : 將括號中的字符作為一個分組 \num : 引用分組num匹配到的字符串 (?P<name>) : 分組起別名 (?P=name) : 引用別名為name分組匹配到的字符串 """
'''示例4 匹配0-100之間的數字''' r = re.match(r'[1-9]\d?$|0$|100$','100' ) print(r) #<re.Match object; span=(0, 3), match='100'> # 改進版 r = re.match(r'[1-9]?\d?$|100$','0' ) print(r) #<re.Match object; span=(0, 1), match='0'>
''' 示例5: 從字符串中抽取特定的字符 , 如抽取h1標簽之間的字符 ''' s = '<h1>我是中國人</h1>' r = re.match(r"<h1>(.*)</h1>",s) print(r.group()) #<h1>我是中國人</h1> print(r.group(1)) # 我是中國人 , 1 : 表過正則表達式分組第1次出現 s = '<h1>打倒小日本</h1>' r = re.match(r"<h1>(.*)</h1>",s) print(r.group()) #<h1>打倒小日本</h1> print(r.group(1)) # 打倒小日本 , 1 : 表過正則表達式分組第1次出現 s = '<h1>打倒小日本 我是中國人</h1>' r = re.match(r"<h1>(\D*)\s(\D*)</h1>",s) print(r.group()) #<h1>打倒小日本 我是中國人</h1> print(r.group(1)) # 打倒小日本 取第1個分組的值 print(r.group(2)) # 我是中國人 取第2個分組的值 print(r.groups()) # 將所有的分組結果以一個元組的形式打印出來
''' 示例6: 匹配<html><h1>zhengqinfeng</h1></html>,且,首尾尖括號中的內容相同、內層尖括號中的內容相同 ''' s = '<html><h1>zhengqinfeng</h1></html>' r = re.match(r'<.+><.+>.+</.+></.+>',s) print(r) #<re.Match object; span=(0, 34), match='<html><h1>zhengqinfeng</h1></html>'> # 上面的正則貌似完成了需要,實則不然, 它並不滿足"且"后面的要求,所以正確的正則如下 r= re.match(r'<(.+)><(.+)>.+</\2></\1>',s) # 正則前面加r,不會進行字符串轉義 print(r) #<re.Match object; span=(0, 34), match='<html><h1>zhengqinfeng</h1></html>'> s = '<html><h1>zhengqinfeng</h2></html>' r= re.match(r'<(.+)><(.+)>.+</\2></\1>',s) # 正則前面加r,不會進行字符串轉義 print(r) #None """ 使用()時,re會記錄()中的內容,我們可以使用\num來引用 在上面的示例中, 第一次出現的(.+) re會記錄為num =1 ; 第二次出現的 (.+) re會記錄為num =2 在后面使用時,可以直接\1, \2來引用值 """
由例5,例6兩示例可知,正則分組用途如下:
1. 從字符串提取出特定的字符
2. 動態引用分組內容進行匹配
''' 示例7: 抽取郵箱賬號 (163|126|135|qq|gmail) :表示匹配其中一種 \. : 匹配郵箱中的. (com|cn|net) : 表示匹配郵箱后綴中的一種 $ : 表結束 ,也就是說郵箱是以com,cn,或者是net結尾 ''' p = r'(\w+)@(163|126|135|qq|gmail)\.(com|cn|net)$' r = re.match(p, '132@163.com') print(r) print(r.groups()) print(r.group(1)) # 提取郵箱賬號 132
''' 示例8: 正則分組取名字 ''' s = '<html><h1>zhengqinfeng</h1></html>' r = re.match('<(?P<key1>.+)><(?P<key2>.+)>.+</(?P=key2)></(?P=key1)>',s) print(r) # <re.Match object; span=(0, 34), match='<html><h1>zhengqinfeng</h1></html>'> print(r.groups()) # ('html', 'h1')