一、正則表達式:正則是很大的一個知識點,不會僅僅是下面這些東西
1、概念:正則表達式就是一種對字符串匹配的規則,注意是只對字符串,正則表達式和python沒啥關系,
2、表達式:
(1)字符集:用中括號表示,例如[1-9],[012345],[a-z1-9],[A-z]
字符集代表的是一個字符的匹配規則,不需寫標點符號,可以多種規則連著寫,按從小到大的排列(ascii值,所以大寫A到小寫z也可以,但一般不這么寫)
(2)元字符
. ? ? 匹配除換行符以外的任意字符
\w ? ?匹配數字字母和下劃線的字符 ? ?大寫代表非數字字母下劃線的字符
\s 匹配空白符 ? ? ? ? ? ? ? ?大寫代表非空白符的字符
\d ? ?匹配數字 大寫代表非數字的字符
^ ? ? ?匹配字符串的開始,寫在開頭 ? ? [ ^ ] ?若寫在字符集當中就代表除字符集中以外所有的字符?
$ ? ? 匹配字符串的結尾,寫在最后
(3)量詞
* ?零次或多次
+ 一次或多次
?零次或一次
{1}只有1次
{2,10}2到10次
{4,}4次或多次
規則:盡量匹配多次;量詞只能操作前一個字符的次數。也就是說不會只對一個字符進行匹配就完了,而是將指定次數的匹配當作一次整體的匹配
(4)貪婪匹配:使用量詞匹配,每次盡量匹配多次
?非貪婪匹配:在量詞后加?,就是盡量匹配最少次
(5)分組:小括號;可以把一組字符當作一個整體,匹配這個整體也可以使用量詞使這個整體重復匹配;對于一條匹配的正則,只對需要的內容進行分組
(6)轉義符:\ 對于一些有特殊意義的字符用\可以表示本身,在python中用r轉義
補充:
1、回溯算法:例如<.*?> ?會一直匹配,當遇到>后不會停止會繼續匹配,待匹配到最后還是沒有>就會回頭回到之前的>
2、.*?字符 ? 取前面任意長度的字符,直到字符出現
二、re模塊
1、和正則的關系:python中的re模塊就是為正則服務的
2、方法
(1)findall(正則,要匹配的字符串) ?輸出的列表類型,元素為每一個匹配的字符串;若沒有匹配上,就輸出空列表
(2)search(正則,要匹配的字符串) 輸出的是一種對象并不顯示匹配的字符串,通常用group()來顯示匹配上的字符串
例如:
import re
ret = ?search(正則,字符串)
if ? ret ? : ? ? 若沒有匹配上,則輸出None
print(ret.group() ) ? 注意這里group只能顯示第一個匹配上的字符串,若本身字符串很長有多個匹配項,但是group也只能顯示出第一個
(3)match() ?用法和search一樣,但是,不同的是match會自動在正則前面加上^,代表以什么開頭,所以group輸出的值只能是字符串開始匹配上的字符
?
(4)分割 split(正則[ab],字符串)按照正則的規則依次分割,例如先匹配a后分割得到的結果再按b分割,最后輸出的是列表
(5)替換 sub(正則,要替換的內容,字符串,次數) 按照正則匹配上的內容換成 ? 要替換的內容 ? 再輸出替換好的字符串。次數是指替換幾次,也就是替換前幾個
(6)sunb()會直接顯示輸出替換的次數
?
(7)obj = ?re.compile (正則) ? 將正則表達式編譯為正則表達式對象,這樣可以用來對多個字符串進行相同正則的匹配
(8)finditer(正則,字符串) ?會直接輸出一個迭代器,可循環取值,取值時要用group()
三、進階知識
1、findall優先級查詢:會優先顯示分組即小括號里的匹配內容,而自動不顯示括號外的匹配內容
解決辦法:(?:......... ? ? ?) ? 只要在小括號里的開頭加上問號和冒號,注意一定不要分開
2、split 優先級查詢:若在正則表達式兩邊加了括號,則分割時還會顯示出原本要匹配的內容,例如上一節中的(4)給[ab]加括號([ab]),這樣的話分割出來的內容也會有a和b
3、匹配標簽:在search方法中,在要選擇輸出的正則規則前面加上?P<名字>,然后把正則規則用小括號括起來


import re ret=re.search('<\w+>(?P<name>\w+)<\w+>','<h1>hello<h1>') print(ret.group('name'))
?若遇到字符串有重復的內容使我們需要的,不能每一次都寫一個新的名字,只要在需要的正則位置兩邊加上括號,開頭寫?P=名字,而且括號里的正則也不需要留著


import re ret=re.search('<(?P<name>\w+)>\w+<(?P=name)>','<h1>hello<h1>') print(ret.group('name'))
?