- 內容
組的概念
貪婪與非貪婪
- 組連續的滿足某個條件的字串,()內的內容構成乙個組。
# 提取文章發布日期
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.首先如何任何正規表示式使用的基礎都是編譯正規表示式的表...