練習的時候使用linux+ipython,ipython安裝
python的元字符
# 元字符 :
# . ^ $ * + ? {} [] \ | ()
注:\w還可以匹配下划線和漢字
[ab\d]表示只要匹配該集合中的任一一個表達式都OK
注意並不是按照集合的順序來匹配的。而是返回第一個符合條件的字符串
注:^$匹配的是行首和行尾, \A\Z匹配的是字符串的首尾【沒整沒明白】
*? +? ??
首先明確一點,他們必須結合左右的正則進行匹配,左邊必須有內容,右邊可以沒有,即為''
?? =(匹配字符1?)?匹配字符2, 字符1{0,1}+字符2, 字符1出現次數<=1,字符2出現次數>=1
In [149]: re.match(r'\w??\d','123wer123') # 第一個\d即數字之前,\w匹配最少可以一次都不匹配,返回第一個數字 Out[149]: <re.Match object; span=(0, 1), match='1'> In [150]: re.match(r'\w??\d','w123wer123') # 第一個\d數字之前,\w最少可以只匹配一次,返回一個字母+第一個數字 Out[150]: <re.Match object; span=(0, 2), match='w1'> In [151]: re.match(r'\w??\d','wx123wer123') # 第一個\d數字之前,\w最少會匹配超過一次,最終匹配失敗,返回None In [152]: re.match(r'\w??\d','wxwer') #\d沒匹配到,所以最終匹配失敗,返回None In [153]: re.match(r'\w??','wxwer') # 在第一個''之前,\w最少可以只匹配0次,最多匹配1次, 非貪婪模式選擇最少匹配次數,\w匹配0次,所以返回'' Out[153]: <re.Match object; span=(0, 0), match=''>
*? = 其實可以拆分看 字符1*?字符2,相當於 (字符1*)?字符2, 字符1{0,}+第一個字符2, 字符1次數>=0,字符2出現次數>=1
In [154]: re.match(r'\w*?\d','123wer123') # \w匹配0次,返回第一個數字
Out[154]: <re.Match object; span=(0, 1), match='1'> In [155]: re.match(r'\w*?\d','wx123wer123') # \w匹配2次, 返回2個字母+一個數字 Out[155]: <re.Match object; span=(0, 3), match='wx1'> In [156]: re.match(r'\w*?\d','wxe') # \d沒有匹配項,最終匹配失敗,返回None In [157]: re.match(r'\w*?','wxe') # 遇到第一個''之前\w可以最多匹配三個,最少可以一次都不匹配,非貪婪模式按\w匹配次數最少的來, \w匹配0次,最終返回'' Out[157]: <re.Match object; span=(0, 0), match=''>
+?=(字符1+)?字符2, 字符1{1,}+第一個字符2, 字符1出現次數>=1,字符2出現次數>=1
In [160]: re.match(r'\w+?\d','%123wer123') # \w匹配0次,最終匹配失敗,返回None In [161]: re.match(r'\w+?\d','wsx123wer123') #\w匹配3次,最后返回三個字母+第一個數字 Out[161]: <re.Match object; span=(0, 4), match='wsx1'> In [162]: re.match(r'\w+?\d','wsxwer') # \d匹配0次,最終匹配失敗,返回None In [163]: re.match(r'\w+?','wsxwer') # 遇到第一個''之前,\w在這里最多可以匹配6次,最好必須匹配一次,非貪婪模式就是按最少的次數來,所以返回第一個字母+'',即第一個字母 Out[163]: <re.Match object; span=(0, 1), match='w'>
In [165]: re.match(r'w+?\w','wsxwer') # 注意返回的是ws而不是wsxwe,w+表示w可以出現1到多次,ws中w只匹配一次,wsxwe卻匹配了2次,非貪婪模式就是撿w匹配次數最少的來,所以返回ws
Out[165]: <re.Match object; span=(0, 2), match='ws'>
看如下示例應該能更好的理解
理解了*?,+?就更好理解了,單獨使用同{1},配合后面的表達式使用的時候意味着如果能匹配到后面的表達式則前面無限長匹配,
如果不能匹配到后面一個表達式則只返回匹配到的第一個字符
|單獨使用只匹配左右緊鄰的表達式,可以和()結合使用
如下示例可以看出分組結合|的妙用, r'1cb|ab' 只能匹配到1cbb和1cab
但是r'1(cb|ab)'則表示匹配1cb和1ab,是把ab和cb當做一個整體
引用編號分組和別名分組,如果分組比較多的時候建議用別名分組
- \元字符 表示匹配元字符本身
- ^ 脫字符,匹配輸入字符串的開始的位置
整個字符串的第一個字符
- $ 匹配輸入字符串的結束位置
整個字符串結束字符,但如果最后一個是換行符那按照倒數第二個也可以匹配到,當然直接按照換行符也可以匹配到
- \b 表示單詞的邊界,\B與\b相反
- \d 匹配0~9的數字
- \D 匹配數字以外的字符
- \w 匹配字母或數字或下划線或漢字等
- \W與\w的含義相反,是匹配特殊字符的
- \s 匹配任意的空白符,包括空格,制表符(Tab),換行符等,\S匹配非空白字符