Python正則表達式?r'(.*)?are?(.*?)?.*'的深入理解
在學習Python3的正則表達式的時候遇到一個例子
#!/usr/bin/python3 import re line = "Cats are smarter than dogs" # .* 表示任意匹配除換行符(\n、\r)之外的任何單個或多個字符 # (.*?) 表示"非貪婪"模式,只保存第一個匹配到的子串 matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I) if matchObj: print ("matchObj.group() : ", matchObj.group()) print ("matchObj.group(1) : ", matchObj.group(1)) print ("matchObj.group(2) : ", matchObj.group(2)) else: print ("No match!!")
運行結果為
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
這個例子主要的理解為r‘(.*) are (.*?) .*’,以下為我查詢資料之后所得到的個人理解以及試驗
- 前面的r比較好理解,表示字符串為非轉義的原始字符串,讓編譯器忽略反斜杠,也就是忽略轉義字符。但是這個例子中字符串里沒有反斜杠,所以這個r可有可無。
- (.*) 第一個匹配分組,.*代表匹配除換行符之外的所有字符
- (.*?)第二個匹配分組,.*?后面多個問號,代表非貪婪模式,也就是說只匹配符合條件的最少字符
- 后面的一個.* 沒有括號包圍,所以不是分組,匹配效果和第一個一樣,但是不計入匹配結果中。
綜上所屬以一種通俗易懂的描述就是將字符串以are為中斷分為幾部分,(.*)因為是貪婪的,所以返回的是所有滿足條件的內容太,(.*?)為非貪婪模式,所以返回第一個滿足要求的內容或沒有
匹配成功,這句話如果不好理解就看看下面這個例子
#!/usr/bin/python3 import re #line = "Cats are smarter than dogs" line = "a a Cats are Cats are smarter than dogs" # .* 表示任意匹配除換行符(\n、\r)之外的任何單個或多個字符 # (.*?) 表示"非貪婪"模式,只保存第一個匹配到的子串 matchObj = re.match( r'(.*) are (.*) .*', line, re.M|re.I) if matchObj: print ("matchObj.group() : ", matchObj.group()) print ("matchObj.group(1) : ", matchObj.group(1)) print ("matchObj.group(2) : ", matchObj.group(2)) else: print ("No match!!")
輸出結果:
matchObj.group() : a a Cats are Cats are smarter than dogs
matchObj.group(1) : a a Cats are Cats
matchObj.group(2) : smarter than
這個例子主要是將第一個例子中的line字符串進行了觀察輸出結果
group(1)對應第一個括號的條件,我理解為最后滿足are分段的前面的所有內容,如果將第一個括號改為(.*?)就是第一個are的前面內容,經過驗證確實是這樣的,這里就不貼程序了可以自行驗證
以下示例為更好的解釋第二個括號的內容以及無括號的.*
#!/usr/bin/python3 import re #line = "Cats are smarter than dogs" line = "a a Cats are Cats are smarter than dogs" # .* 表示任意匹配除換行符(\n、\r)之外的任何單個或多個字符 # (.*?) 表示"非貪婪"模式,只保存第一個匹配到的子串 matchObj = re.match( r'(.*?) are (.*) .* .*', line, re.M|re.I) if matchObj: print ("matchObj.group() : ", matchObj.group()) print ("matchObj.group(1) : ", matchObj.group(1)) print ("matchObj.group(2) : ", matchObj.group(2)) else: print ("No match!!")
matchObj.group() : a a Cats are Cats are smarter than dogs
matchObj.group(1) : a a Cats
matchObj.group(2) : Cats are smarter
group(2)對應第二個括號的條件:因為我將這里第一個括號的內容添加了?所以第一個括號索引的內容就是第一個are前面的內容,第二個括號就在當前這個are之后開始索引,在這里我沒有加不加? 所以輸出為輸出后面出去.*條件的所有內容
.*因為沒有()所以不能使用group訪問,但是會實際占用位置,上面例子最后使用了兩個.* 所以最后占用兩個單詞,那么前面的內容就是group(2)的輸出內容了
可以自己嘗試一個多加幾個 are在語句中 然后判斷語句修改有無?或者括號進行觀察效果
#!/usr/bin/python3 import re #line = "Cats are smarter than dogs" line = "a a Cats are CatsB are smarter are than are dogs are dogs b c d e" # .* 表示任意匹配除換行符(\n、\r)之外的任何單個或多個字符 # (.*?) 表示"非貪婪"模式,只保存第一個匹配到的子串 matchObj = re.match( r'(.*?) are (.*?) (.*?) (.*) .*', line, re.M|re.I) if matchObj: print ("matchObj.group() : ", matchObj.group()) print ("matchObj.group(1) : ", matchObj.group(1)) print ("matchObj.group(2) : ", matchObj.group(2)) print ("matchObj.group(3) : ", matchObj.group(3)) print ("matchObj.group(4) : ", matchObj.group(4)) else: print ("No match!!")
matchObj.group() : a a Cats are CatsB are smarter are than are dogs are dogs b c d e
matchObj.group(1) : a a Cats
matchObj.group(2) : CatsB
matchObj.group(3) : are
matchObj.group(4) : smarter are than are dogs are dogs b c d
總結
到此這篇關于Python正則表達式 r‘(.*) are (.*?) .*‘的深入理解的文章就介紹到這了,更多相關Python正則表達式 r‘(.*) are (.*?) .*‘內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python 如何利用chinese_calendar 獲取上一個工作日日期
這篇文章主要介紹了python 利用chinese_calendar 獲取上一個工作日日期,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03python 爬蟲一鍵爬取 淘寶天貓寶貝頁面主圖顏色圖和詳情圖的教程
今天小編就為大家分享一篇python 爬蟲一鍵爬取 淘寶天貓寶貝頁面主圖顏色圖和詳情圖的教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05