re.findall 匹配到正則表達式的字元,匹配到的每個字元存入一個列表,返回一個匹配到的所有字元列表 一. 匹配單個字元 import re # \w 匹配所有字母、數字、下劃線 re.findall('\w','abcd_123 *-') # 結果為:['a', 'b', 'c', 'd', ...
re.findall 匹配到正則表達式的字元,匹配到的每個字元存入一個列表,返回一個匹配到的所有字元列表 一. 匹配單個字元
import re # \w 匹配所有字母、數字、下劃線 re.findall('\w','abcd_123 *-') # 結果為:['a', 'b', 'c', 'd', '_', '1', '2', '3'] # \s 匹配所有不可見字元 # 不可見字元有:\n \t 空格 re.findall('\s','abcd \n\tdf21 ') # 結果為:[' ', '\n', '\t', ' ', ' '] # \d 匹配所有數字 re.findall('\d','a1bc3 4d \n\tdf21 ') # 結果為:['1', '3', '4', '2', '1'] # . 匹配\n換行符以外的所有可見和不可見字元 re.findall('.', 'c3 d\n\td1') # 結果為:['c', '3', ' ', 'd', '\t', 'd', '1']
二. 匹配多個字元
#匹配多個字元:* + ? {} import re # * 匹配0或n次 re.findall('\d*', '1a23') # 結果為:['1', '', '23', ''] # + 匹配1或n次 re.findall('\d+', '1a23') # 結果為:['1', '23'] #前面2個是叫貪婪匹配 # ? 匹配0或1次 re.findall('\d?', '1a3') # 結果為:['1', '', '3', ''] # 這個叫非貪婪匹配
三. 匹配指定範圍字元
# {m,n} 匹配最少m次,最多n次 # {m} 只匹配m次的 # {,n} 匹配最大n次,最小次數不限 # {m,} 匹配最小m次,最大次數不限 re.findall('\d{2,4}', '1a33g134nn12345') # 結果為:['33', '134', '1234'] re.findall('a{3}', '1aaa3*G+1aaaan#b') # 結果為:['aaa', 'aaa'] # | 匹配 或 語法的字元 re.findall('1|23|4', '1a33g134nn12345') # 結果為:['1', '1', '4', '1', '23', '4'] # [ ] 匹配括弧內的字元(只匹配單個) re.findall('[123]', '1a33g134nn12345') # 結果為:['1', '3', '3', '1', '3', '1', '2', '3'] re.findall('[0-9a-zA-Z]', '1a3*G+1n#') # 匹配0到9或者a到z或者A到Z單個字元 # 結果為:['1', 'a', '3', 'G', '1', 'n'] # ^x 行首匹配 # x$ 行尾匹配 re.findall('^1', '1a3*G+1n#b') re.findall('1$', '1a3*G+1n#b') # 結果為:['1'] # 結果為:['b']
四. 一些比較不常見的匹配
1、\b 單詞邊界,重點理解在於‘邊界’二字,‘單詞’代表匹配的字元串,
劃定邊界基本原則:比如表達式為 '\b單詞\b' 的意思就是匹配字元串為‘單詞’,單詞兩邊需要存在滿足條件的邊界才能匹配成功。匹配失敗結果肯定是空列表,匹配成功結果就是匹配的單詞字元串列表。
\b在哪邊就限制哪邊的匹配。
匹配成功的邊界滿足條件跟匹配單詞字元串有關聯,雙方是同一類型則失敗,不同類型則成功
# 正則表達式中的\b可以用匹配目標單詞字元串,加設限制匹配邊界 # 單詞的 前邊界:'\b單詞' # 後邊界:'單詞\b' # 前和後邊界:'\b單詞\b' # 在\b的使用中有這樣幾點是需要格外註意的。 # 0. \b本身的含義就有轉義字元串的作用,要用字元邊界就得將其原始含義去掉,所以需要加r或者\\b(兩個不能一起用) # 1. 單詞字元串能否匹配成功是有規律的: # 如果是a-z,A-Z,0-9,則匹配邊界為非字母數字才能匹配成功。 # 如果是非字母數字,則匹配邊界為a-z,A-Z,0-9才能匹配成功。 # 如果是兩個混在一起,判斷標準為那個挨著\b最近的字元作為判斷標準,如果是字母數字,則匹配邊界為非字母數字才成功,反之亦然。 import re s='aa abcperty/-aa ' res1=re.findall(r'\babc',s) # 結果:['abc'] 單詞為字母,左匹配邊界為非字母數字,匹配成功 res2=re.findall(r'abc\b',s) # 結果:[] 單詞為字母,右匹配邊界為字母,匹配失敗 print(res1,res2) s='aa@# perty/-aa ' res3=re.findall(r'\b@#',s) # 結果:['@#'] 單詞為非字母數字,左匹配邊界為字母,匹配成功 res4=re.findall(r'@#\b',s) # 結果:[] 單詞為非字母數字,右匹配邊界為空格(非字母數字),匹配失敗 print(res3,res4) s='aa@a perty/-aa ' res5=re.findall(r'\b@a',s) # 結果:['@a'] 單詞為混合,@挨著\b,單詞以非字母數字為標準,左匹配邊界為字母,匹配成功 res6=re.findall(r'@a\b',s) # 結果:['@a'] 單詞為混合,a挨著\b,單詞以字母數字為標準,右匹配邊界為空格,匹配成功 print(res5,res6) # 3.字元串的首尾邊界預設定義為 非字母數字,所以如果匹配的單詞字元串在首尾,則匹配字母數字則會成功,匹配非字母數字失敗。 s= 'abcd@' res7 = re.findall(r'\ba',s) # 結果:['a'] 單詞為字母,左匹配邊界為首,預設定義為非字母數字,匹配成功 res8 = re.findall(r'@\b',s) # 結果:[] 單詞為非字母數字,右匹配邊界為尾,預設定義為非字母數字,匹配失敗 print(res7,res8)
未完待續...