Python高階丨正規表示式(中)

2021-10-02 01:52:13 字數 3690 閱讀 9668

- 內容

組的概念

貪婪與非貪婪

- 組連續的滿足某個條件的字串,()內的內容構成乙個組。

# 提取文章發布日期

import re

content =

'發布於2020/1/9'

result = re.findall(

'.*?(\d.*\d)'

, content)

# .*表示匹配除換行符外的任意字元,?表示非貪婪匹配

# (\d.*\d)表示乙個組,以數字開頭,以數字結尾

print

(result)

# 返回的結果就是括號內匹配到的結果

# 輸出結果:['2020/1/9']

沒有括號

import re

content =

'發布於2020/1/9'

result = re.findall(

'.*?\d.*\d'

, content)

print

(result)

# ['發布於2020/1/9']

# 因為python缺省會再正規表示式首尾各新增乙個括號

# 等價於result = re.findlaa(('.*?\d.&\d'), content)

多個組

# 實現功能:提取發布時間和發布人

import re

content =

'發布於2020/1/9,發布人:派森.'

result = re.findall(

'.*?(\d.*\d).*:(.*)'

, content)

# 兩個括號之間的.*:表示中間是除換行符以外的任意字元,直到遇見:才終止,進入第二個組

print

(result)

# 輸出結果:[('2020/1/9', '派森.')]

- match方法

語法:

re.match(pattern, string, flags=

0)

引數:

pattern:匹配的正規表示式

string:要匹配的字串

flags:標誌位,用於控制正規表示式的匹配方式,如:是否區分大小寫,多行匹配等等

# 實現功能:提取發布時間和發布人

import re

content =

'發布於2020/1/9,發布人:派森.'

result = re.match(

'.*?(\d.*\d).*:(.*)'

, content)

# match方法的引數和findall是一樣的,返回的結果是ere_match物件

print

(result.group())

# 該方法預設是result.group(0)

# 輸出結果:發布於2020/1/9,發布人:派森.

# result.group(0)獲取的內容就是最外層的括號匹配的內容

# 相當於('(.*?\d.*\d).*:(.*))')

print

(result.group(1)

)# 輸出結果:2020/1/9

# 獲取的內容是(\d.*\d)匹配到的內容

print

(result.group(2)

)# 輸出結果:派森.

# 獲取的內容是(.*)匹配到的內容

print

(result.groups())

# 輸出結果:('2020/1/9', '派森.')

使用match注意事項

import re

content =

result = re.match(

'\d'

, content)

print

(result)

# 輸出結果:none

# 如果print(result.group())會報錯

# 原因match方法是從content第乙個字元開始匹配\d,如果未匹配到,直接就返回none,這裡因為content第乙個字元不是數字,所以直接返回none

- 非貪婪模式
# 實現功能:提取發布時間,比較貪婪與非貪婪

import re

content =

'發布於2020/01/09'

result = re.findall(

'.*?(\d.*\d)'

, content)

# 這裡的?表示的就是非貪婪模式,第乙個.*會盡可能少地取匹配內容,因為後面跟的是\d,所以碰見第乙個數字就終止了

print

(result)

# 輸出結果:['2020/01/09']

- 貪婪模式
import re

content =

'發布於2020/01/09'

result = re.findall(

'.*(\d.*\d)'

, content)

print

(result)

# 輸出結果:['09']

第乙個.*後面新增問好,表示的就是貪婪模式,第乙個.*會盡可能多地去匹配內容,後面跟的是\d,碰見第乙個數字並不一定會終止,當它匹配到2020的2的時候,發現剩下的內容依然滿足(\d.*\d),所以會一致匹配下去,直到匹配到01後面的/的時候,發現剩下的09依然滿足(\d.*\d),但是如果再匹配下去,匹配到09的0的話,剩下的9就不滿足(\d.*\d)了,所以第乙個.*就會停止匹配,(\d.*\d)最終匹配到的結果就只剩下09了

非貪婪與貪婪模式案例

例1

import re

content =

'發布於2020/01/09'

result = re.findall(

'.*(\d.*?\d)'

, content)

print

(result)

# 輸出結果:['09']

第乙個.*是貪婪模式,會一直匹配到12後面的/,這樣結果就是[『09』]

例2

import re

content =

'發布於2020/01/09'

result = re.findall(

'.*?(\d.*?\d)'

, content)

print

(result)

# 輸出結果:['20', '20', '01', '09']

第乙個.*?表示非貪婪模式,匹配到2020前面的』於』之後就停止了

括號裡的.*?也是表示非貪婪模式,括號裡的內容從2020的2開始匹配,因為後面乙個數字是0,那麼也就滿足了(\d.*?\d),所以就直接返回結果了,同樣的,接下來的20也是這樣,一直匹配到09才結束。

正規表示式高階

或 的小細節 替換匹配 任一側最大的表示式 2.正規表示式和相應編碼 3.正規表示式引擎 舉例簡單說明nfa與dfa工作的區別 比如有字串this is yansen s blog,正規表示式為 ya msen nsen nsem 不要在乎表示式怎麼樣,這裡只是為了說明引擎間的工作區別 nfa工作方...

正規表示式高階

捕獲組就是把正規表示式中子表示式匹配的內容,儲存到記憶體中以數字編號或手動命名的組裡,以供後面引用。表示式 說明 expression 普通捕獲組,將子表示式expression匹配的內容儲存到以數字編號的組裡 expression 命名捕獲組,將子表示式expression匹配的內容儲存到以nam...

Python高階語法 正規表示式

正規表示式在字串匹配中起到巨大的作用。幾個資料提取工具對比 這裡可以看到雖然正規表示式上手比較難,但是它幾乎是最通用速度最快最靈活的字串分析工具。本文只是介紹如何在python中使用正規表示式,如何去寫正規表示式的式子不是一篇部落格說得清的。1.首先如何任何正規表示式使用的基礎都是編譯正規表示式的表...