如何解決python的re模組group、groups與findall遇見Regex中分組"()"後產生的”眩暈反應“

來源:互聯網
上載者:User

標籤:操作   tuple   形式   出現   TE   att   數字   mat   會展   

 轉載請註明出處:https://www.cnblogs.com/oceanicstar/p/9244783.html  直接先上例子
>>> re.search(‘(book+)‘, ‘mebookbookme‘).groups()(‘book‘,)>>> re.search(‘(book+)‘, ‘mebookbookme‘).group()‘book‘>>> re.search(‘(book)+‘, ‘mebookbookme‘).groups()(‘book‘,)>>> re.search(‘(book)+‘, ‘mebookbookme‘).group()‘bookbook‘>>> re.findall(‘(book)+‘, ‘mebookbookme‘)[‘book‘]>>> re.findall(‘(book+)‘, ‘mebookbookme‘)[‘book‘, ‘book‘]
  是不是被整暈了?  這時,你需要來點理論??回下血: 1. 首先要明白:         search、match與findall在對Regex上匹配次數的區別:        search和match(從頭開始匹配)都是只匹配字串中第一次滿足Regexpattern的內容        findall則是直接把字串中所有滿足Regexpattern的內容匹配出來 2. 其次要弄明白:        (1)group和groups是兩個不同的函數,他們都是搭配search和match後的匹配對象來使用的,因此只會匹配出字串中第一次滿足Regexpattern的內容。        (2)之所以用group和groups是因為在Regex中我們會用到括弧()來進行單元分組,進行重複內容匹配(小括弧後用+號)或指定內容展示(用group(組號)或groups())的操作。        (3)group和groups的用法區別如下:  【m.group()】(這裡m是search或者match後產生的對象)        m.group()可以括弧內不填內容,也可以傳入一個數字N,即m.group(N)。以下分情況說明:         <不傳入N或傳入N=0>
m.group() == m.group(0) == 展示匹配到的第一次滿足Regexpattern的全部內容(所有匹配的字元)
  與括弧無關,這個是API規定的,例如‘(book)+‘的Regex可以對‘yourbookbook‘匹配展示出‘bookbook‘。         <傳入N>0>         返回第N組括弧匹配的字元。(Regex內有幾個()就有幾個分組)        但m.group(1)、m.group(2)、... 之後的分組都只會展示()匹配到的分組括弧裡的內容,例如‘(book)+‘的Regex用m.group(1)對‘yourbookbook‘匹配也只會展示一個‘book‘(因為只有1組小括弧,就只有1個分組)。  【m.groups()】        m.groups() 返回所有括弧匹配的字元(Regex中有幾個括弧就會有幾個分組的字串內容展示),以tuple格式作為容器返回。
m.groups() == (m.group(1), m.group(2), ...)
  什麼,還看不懂? 看來??不能停,逐個分析吧:
  1. 首先,分析下Regexbook+和(book+)
        search對於‘mebookbookme‘字串,用book+或者(book+)這樣的Regex匹配到全部內容本來就是‘book‘        (因為這裡+號是僅對k這個字母來匹配重複的,別搞混了)
>>> re.search(‘book+‘, ‘mebookbookme‘)<_sre.SRE_Match object; span=(2, 6), match=‘book‘>>>> re.search(‘(book+)‘, ‘mebookbookme‘)<_sre.SRE_Match object; span=(2, 6), match=‘book‘>
            所以不管groups()還是group(),都是‘book‘(一個book) 
  1. 而search對於(book)+匹配到的全部內容是‘bookbook‘
>>> re.search(‘(book)+‘, ‘mebookbookme‘)<_sre.SRE_Match object; span=(2, 10), match=‘bookbook‘>
        使用group()是把正則匹配到的內容都展示,即返回‘bookbook‘        
>>> re.search(‘(book)+‘, ‘mebookbookme‘).group()‘bookbook‘
  使用group(1)是把第一個(當然這裡正則只有一個)小括弧裡匹配的內容展示,即返回‘book‘  使用groups()是把所有小括裡匹配的內容以元組打包了返回(當然這裡只有一個小括弧),即返回(‘book‘,)        
>>> re.search(‘(book)+‘, ‘mebookbookme‘).groups()(‘book‘,)

 

        使用findall中匹配分組小括弧()後帶+的例子,和group(1)、groups()展示的類似,就是()後+號匹配到的重複內容是不會展示的,只會展示小括弧內的一次內容,說白了就是Regex裡有幾個小括弧()就展示幾個括弧()內的匹配內容。        
>>> re.findall(‘(book)+‘, ‘mebookbookme‘)[‘book‘]>>> re.findall(‘(book+)‘, ‘mebookbookme‘)[‘book‘, ‘book‘]
  1. 第一個findall對(book)+的展示,直接把+號重複的分組合并為一個單元來展示(這個跟search的groups對於(book)+的展示是一樣的)
  2. 第二個findall對(book+)的展示,則是把所有分組都展示出來
  再加點??,補充一個例子來說明一下findall:         下面的例子不管字串中‘ab‘和‘c‘重複幾次,都只會展示一個‘ab‘和一個‘c‘,當然之所以返回了兩個元組,是因為findall
>>> re.findall(‘(ab)+(c)+‘, ‘abcc123ababcccc‘)[(‘ab‘, ‘c‘), (‘ab‘, ‘c‘)]

 

 

如果我們是要對‘mebookbookme‘匹配出‘bookbook‘,怎麼做呢?  1. 首先分析的是用match、search還是findall?        ‘mebookbookme‘中‘bookbook‘不是出現在第一個字母開始的,所以不能用match;        ‘bookbook‘模式只出現了一次(當然也就是第一次出現‘bookbook‘模式),因此可以用search匹配到;        當然findall能匹配到所有出現的‘bookbook‘模式,是肯定能用的。  2. 具體分析:(1)使用search        使用‘(book+)‘的方式來search,匹配到的完整內容就是‘bookbook‘,選用group()或group(0)返回完整內容就可以了。 
>>> re.search(‘(book)+‘, ‘mebookbookme‘).group()‘bookbook‘>>> re.search(‘(book)+‘, ‘mebookbookme‘).group(0)‘bookbook‘

 

        如果要使用group(1)或groups()[0]呢,該用什麼Regex?        可以使用‘((?:book)+)‘的非擷取的群組(非編號組)的方式,即(?:運算式)的形式,這個小括弧是沒有進入分組編號的。外頭之所以還要加個小括弧,就是因為我們一旦用了group(1)或groups()[0]這樣的方式,必須要有編號為1的小括弧分組。        (PS:當然這個例子這樣做太麻煩,肯定不會選用這種方式,只是為了說明用法) 
>>> re.search(‘((?:book)+)‘, ‘mebookbookme‘).group(1)‘bookbook‘>>> re.search(‘((?:book)+)‘, ‘mebookbookme‘).groups()[0]‘bookbook‘

 

(2)使用findall        使用findall如果搭配小括弧分組的話由於同樣會只返回小括弧裡的內容,所以不能用‘(book)+‘的Regex,但可以採用非擷取的群組(非編號組)的方式。 
>>> re.findall(‘(?:book)+‘, ‘mebookbookme‘)[‘bookbook‘]>>> re.findall(‘(?:book)+‘, ‘mebookbookme‘)[0]‘bookbook‘

 

 轉載請註明出處:https://www.cnblogs.com/oceanicstar/p/9244783.html

如何解決python的re模組group、groups與findall遇見Regex中分組"()"後產生的”眩暈反應“

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.