導入模闆
①import re 導入正規表達式的子產品
re.findall
②findall: re.findall('字元串',變量) 傳回一個清單 ,可通過:判斷清單長度(用 len() )是否大于零判斷是否含有所找字元串; 正規表達式側重在規則(靈魂就在規則,隻是單純的找指定字元串(常量字元串)并沒有意義(python内置函數就可完成這些功能)
③有意義的正規表達式: 大部分的與字元串相關的操作都可以用for循環解決,但是for循環廢腦子且不夠簡潔= =
findall : re.findall('\d',a) 尋找a中所有的數字,并以清單的形式傳回。
正規表達式 由 普通字元 和 元字元 組成,前者就是具體的字元,我們學的是後者
\D: 傳回所有非數字字元組成的清單 -----正規表達式的元字元非常多,可在用的時候查閱手冊~
重點是 正則比對的規則
④字元集特點: 1>出現在 []裡的是或關系 2> ^表示非 例:[^cdf]表示 不是c或d或f的字元 3> c-f :從c到f的字元
4> \d 0-9 等同于 [0-9] ; \D 非數字 等同于 [^0-9] ; \w 字母下劃線(單詞字元) 等同于 [A-Za-z0-9_] ;\W \w的非,包括空格,&,\n, \r,\t ; \s:比對空格,回車,制表,換行 (空白字元) \S : \s的非; . 比對除換行符之外其他所有字元
⑤數量詞: 正則比對,本質是一個字元一個字元比對的,隻能比對單一字元;但是可以通過規則比對多個字元
若想比對多個,用 {} ---- {}中的數字是長度 例:{3}隻比對長度為3;{3,6}長度從3到6的單詞
上述不定長單詞擷取,與 “貪婪”和“非貪婪”有關,python預設情況下是“貪婪”模式------正則比對預設盡可能多的尋找符合條件的字元, 若是想以非貪婪模式比對,須在{}後加?, 例如{3,6}?運作結果幾乎隻和3個一組一緻?
⑥數量詞小結:1> {} 指定數量或數量範圍 2> * 比對0次或者無數次 例: n* 比對0個或者無數個n 3> + 比對一次或者無限多次 4> ? 比對0次或者1次(ps: 隻比對前幾個字元,若是在滿足1個的情況下後邊還有,會傳回比對到一個的結果------?可用于去重操作~ 5>注意區分 貪婪模式下的 ? 和數量詞中的 ?
⑦邊界比對---完整比對整個字元串 : 加上前後邊界符: 前加^ 後加 $ 例:判斷字元串s是否是長度為4-8的整數 re.findall('^\d{4,8}$',s) ^從字元串的開始進行比對 $從字元串的末尾開始比對 ps:^ 和 $ 可單獨用
⑧判斷字元串中含有多少重複單詞(字元組合): 組:用()括起來的内容是一個組 每個字元之間是且關系 ps:[]每個字元之間是或關系
⑨findall第三個參數---模式 re.I 忽略大小寫,re.S 點号. 比對換行符(預設不比對換行符) ,第三個參數可以由多個模式,不同模式之間用 | 連接配接 (此處是 且 關系,而不是常見的 或 關系)
re.sub
⑩re.sub 正則替換 函數參數清單:
count:預設 0 比對所有的pattern,其他數字含義:比對并替換的最大次數;
r1=re.sub('C#','C++',s) 作用 同python的内置函數replace (r2=s.replace('C#','C++') , ps:字元串是不可變的,replace後要用新的字元串接收~
⑩① sub的強大之處在于,第二個參數可以是函數!
ps: 函數的傳回值必須是 字元串
search與match
⑩② search:搜尋整個字元串,直到找到第一個比對的結果; 傳回的結果不是清單,而是一個對象,需要用group() 傳回字元串 或者 span傳回 位置(a,b)a為所找字元串的上一個字元所在數字,b為所找字元串最有一個字元位置
match:從字元串首字母開始進行比對
分組
⑩③ group() 傳入0,傳回全部比對的字元;傳入1,傳回第一個分組的字元串;傳入2,傳回第二個分組的字元串;可同時傳入 0,1,2 即 r.group(0,1,2)
ps:search的傳回結果可用group()
2020.11.11