歡迎光臨
每天分享高質量文章

Python正則運算式很難?一篇文章搞定他,不是我吹!

 

1. 正則運算式語法

1.1 字元與字元類

學習python中有什麼不懂的地方,小編這裡推薦加小編的python學習群:696541369有任何不懂的都可以在裡面交流,還有很好的影片教程pdf學習資料,大家一起學習交流!

1 特殊字元:.^$?+*{}|

以上特殊字元要想使用字面值,必須使用進行轉義

2 字元類

1. 包含在[]中的一個或者多個字元被稱為字元類,字元類在匹配時如果沒有指定量詞則只會匹配其中的一個。

2. 字元類內可以指定範圍,比如[a-zA-Z0-9]表示a到z,A到Z,0到9之間的任何一個字元

3. 左方括號後跟隨一個,表示否定一個字元類,比如[0-9]表示可以匹配一個任意非數字的字元。

4. 字元類內部,除了之外,其他特殊字元不再具備特殊意義,都表示字面值。放在第一個位置表示否定,放在其他位置表示本身,-放在中間表示範圍,放在字元類中的第一個字元,則表示-本身。

5. 字元類內部可以使用速記法,比如d s w

3 速記法

. 可以匹配除換行符之外的任何字元,如果有re.DOTALL標誌,則匹配任意字元包括換行

d匹配一個Unicode數字,如果帶re.ASCII,則匹配0-9

D 匹配Unicode非數字

s匹配Unicode空白,如果帶有re.ASCII,則匹配中的一個

S 匹配Unicode非空白

w匹配Unicode單詞字元,如果帶有re.ascii,則匹配[a-zA-Z0-9_]中的一個

W 匹配Unicode非單子字元

1.2 量詞

1. ?匹配前面的字元0次或1次

2. *匹配前面的字元0次或多次

3. +匹配前面的字元1次或者多次

4. {m}匹配前面運算式m次

5. {m,}匹配前面運算式至少m次

6. {,n}匹配前面的正則運算式最多n次

7. {m,n}匹配前面的正則運算式至少m次,最多n次

註意點:

以上量詞都是貪婪樣式,會盡可能多的匹配,如果要改為非貪婪樣式,透過在量詞後面跟隨一個?來實現

1.3 組與捕獲

1 ()的作用:

1. 捕獲()中正則運算式的內容以備進一步利用處理,可以透過在左括號後面跟隨?:來關閉這個括號的捕獲功能

2. 將正則運算式的一部分內容進行組合,以便使用量詞或者|

2 反響取用前面()內捕獲的內容:

1. 透過組號反向取用

每一個沒有使用?:的小括號都會分配一個組好,從1開始,從左到右遞增,可以透過i取用前面()內運算式捕獲的內容

2. 透過組名反向取用前面小括號內捕獲的內容

可以透過在左括號後面跟隨?P,尖括號中放入組名來為一個組起一個別名,後面透過(?P=name)來取用 前面捕獲的內容。如(? Pw+)s+(?P=word)來匹配重覆的單詞。

3 註意點:

反向取用不能放在字元類[]中使用。

1.4 斷言與標記

斷言不會匹配任何文字,只是對斷言所在的文字施加某些約束

1 常用斷言:

1. 匹配單詞的邊界,放在字元類[]中則表示backspace

2. B 匹配非單詞邊界,受ASCII標記影響

3. A 在起始處匹配

4. ^在起始處匹配,如果有MULTILINE標誌,則在每個換行符後匹配

5. Z 在結尾處匹配

6. $在結尾處匹配,如果有MULTILINE標誌,則在每個換行符前匹配

7. (?=e)正前瞻

8. (?!e)負前瞻

9. (?<=e)正回顧

10.(?

2 前瞻回顧的解釋

前瞻: exp1(?=exp2) exp1後面的內容要匹配exp2

負前瞻: exp1(?!exp2) exp1後面的內容不能匹配exp2

後顧: (?<=exp2)exp1 exp1前面的內容要匹配exp2

負後顧: (?

例如:我們要查詢hello,但是hello後面必須是world,正則運算式可以這樣寫:”(hello)s+(?=world)”,用來匹配”hello wangxing”和”hello world”只能匹配到後者的hello

1.5 條件匹配

(?(id)yes_exp|no_exp):對應id的子運算式如果匹配到內容,則這裡匹配yes_exp,否則匹配no_exp

1.6 正則運算式的標誌

1. 正則運算式的標誌有兩種使用方法

1. 透過給compile方法傳入標誌引數,多個標誌使用|分割的方法,如re.compile(r”#[da-f]{6}”, re.IGNORECASE|re.MULTILINE)

2. 透過在正則運算式前面新增(?標誌)的方法給正則運算式新增標誌,如(?ms)#[da-z]{6}

2. 常用的標誌

re.A或者re.ASCII, 使 B s S w W d D都假定字串為假定字串為ASCII

re.I或者re.IGNORECASE使正則運算式忽略大小寫

re.M或者re.MULTILINE 多行匹配,使每個^在每個回車後,每個$在每個回車前匹配

re.S或者re.DOTALL 使.能匹配任意字元,包括回車

re.X或者re.VERBOSE 這樣可以在正則運算式跨越多行,也可以新增註釋,但是空白需要使用s或者[ ]來表示,因為預設的空白不再解釋。如:

re.compile(r”””

[^>]*?#不是src的屬性

src=#src屬性的開始

(?:

(?P[“‘])#左引號

(?P[^>]+?)#圖片名字

(?P=quote)#右括號

“””,re.VERBOSE|re.IGNORECASE)

2. Python正則運算式模組

 2.1 正則運算式處理字串主要有四大功能

1. 匹配 檢視一個字串是否符合正則運算式的語法,一般傳回true或者false

2. 獲取正則運算式來提取字串中符合要求的文字

3. 替換查詢字串中符合正則運算式的文字,並用相應的字串替換

4. 分割使用正則運算式對字串進行分割。

2.2 Python中re模組使用正則運算式的兩種方法

1. 使用re.compile(r, f)方法生成正則運算式物件,然後呼叫正則運算式物件的相應方法。這種做法的好處是生成正則物件之後可以多次使用。

2. re模組中對正則運算式物件的每個物件方法都有一個對應的模組方法,唯一不同的是傳入的第一個引數是正則運算式字串。此種方法適合於只使用一次的正則運算式。

2.3 正則運算式物件的常用方法

1. rx.findall(s,start, end):

傳回一個串列,如果正則運算式中沒有分組,則串列中包含的是所有匹配的內容,

如果正則運算式中有分組,則串列中的每個元素是一個元組,元組中包含子分組中匹配到的內容,但是沒有傳回整個正則運算式匹配的內容

2. rx.finditer(s, start, end):

傳回一個可迭代物件

對可迭代物件進行迭代,每一次傳回一個匹配物件,可以呼叫匹配物件的group()方法檢視指定組匹配到的內容,0表示整個正則運算式匹配到的內容

3. rx.search(s, start, end):

傳回一個匹配物件,倘若沒匹配到,就傳回None

search方法只匹配一次就停止,不會繼續往後匹配

4. rx.match(s, start, end):

如果正則運算式在字串的起始處匹配,就傳回一個匹配物件,否則傳回None

5. rx.sub(x, s, m):

傳回一個字串。每一個匹配的地方用x進行替換,傳回替換後的字串,如果指定m,則最多替換m次。對於x可以使用/i或者/gid可以是組名或者編號來取用捕獲到的內容。

模組方法re.sub(r, x, s, m)中的x可以使用一個函式。此時我們就可以對捕獲到的內容推過這個函式進行處理後再替換匹配到的文字。

6. rx.subn(x, s, m):

與re.sub()方法相同,區別在於傳回的是二元組,其中一項是結果字串,一項是做替換的個數。

7. rx.split(s, m):分割字串

傳回一個串列

用正則運算式匹配到的內容對字串進行分割

如果正則運算式中存在分組,則把分組匹配到的內容放在串列中每兩個分割的中間作為串列的一部分,如:

rx = re.compile(r”(d)[a-z]+(d)”)

s = “ab12dk3klj8jk9jks5”

result = rx.split(s)

傳回[‘ab1’, ‘2’, ‘3’, ‘klj’, ‘8’, ‘9’, ‘jks5’]

8. rx.flags():正則運算式編譯時設定的標誌

9. rx.pattern():正則運算式編譯時使用的字串

 2.4 匹配物件的屬性與方法

01. m.group(g, …)

傳回編號或者組名匹配到的內容,預設或者0表示整個運算式匹配到的內容,如果指定多個,就傳回一個元組

02. m.groupdict(default)

傳回一個字典。字典的鍵是所有命名的組的組名,值為命名組捕獲到的內容

如果有default引數,則將其作為那些沒有參與匹配的組的預設值。

03. m.groups(default)

傳回一個元組。包含所有捕獲到內容的子分組,從1開始,如果指定了default值,則這個值作為那些沒有捕獲到內容的組的值

04. m.lastgroup()

匹配到內容的編號最高的捕獲組的名稱,如果沒有或者沒有使用名稱則傳回None(不常用)

05. m.lastindex()

匹配到內容的編號最高的捕獲組的編號,如果沒有就傳回None。

06. m.start(g):

當前匹配物件的子分組是從字串的那個位置開始匹配的,如果當前組沒有參與匹配就傳回-1

07. m.end(g)

當前匹配物件的子分組是從字串的那個位置匹配結束的,如果當前組沒有參與匹配就傳回-1

08. m.span()

傳回一個二元組,內容分別是m.start(g)和m.end(g)的傳回值

09. m.re()

產生這一匹配物件的正則運算式

10. m.string()

傳遞給match或者search用於匹配的字串

11. m.pos()

搜尋的起始位置。即字串的開頭,或者start指定的位置(不常用)

12. m.endpos()

搜尋的結束位置。即字串的末尾位置,或者end指定的位置(不常用)

2.5 總結

1. 對於正則運算式的匹配功能,Python沒有傳回true和false的方法,但可以透過對match或者search方法的傳回值是否是None來判斷

2. 對於正則運算式的搜尋功能,如果只搜尋一次可以使用search或者match方法傳回的匹配物件得到,對於搜尋多次可以使用finditer方法傳回的可迭代物件來迭代訪問

3. 對於正則運算式的替換功能,可以使用正則運算式物件的sub或者subn方法來實現,也可以透過re模組方法sub或者subn來實現,區別在於模組的sub方法的替換文字可以使用一個函式來生成

4. 對於正則運算式的分割功能,可以使用正則運算式物件的split方法,需要註意如果正則運算式物件有分組的話,分組捕獲的內容也會放到傳回的串列中

    贊(0)

    分享創造快樂