日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python re match groups_【原创】如何治疗使用python中re模块group、groups与findall分组匹配后产生的“眩晕反应”...

發(fā)布時間:2024/10/8 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python re match groups_【原创】如何治疗使用python中re模块group、groups与findall分组匹配后产生的“眩晕反应”... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

直接先上例子

>>> 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在對正則表達式上匹配次數(shù)的區(qū)別:

search和match(從頭開始匹配)都是只匹配字符串中第一次滿足正則表達式pattern的內(nèi)容

findall則是直接把字符串中所有滿足正則表達式pattern的內(nèi)容匹配出來

2. 其次要弄明白:

(1)group和groups是兩個不同的函數(shù),他們都是搭配search和match后的匹配對象來使用的,因此只會匹配出字符串中第一次滿足正則表達式pattern的內(nèi)容。

(2)之所以用group和groups是因為在正則表達式中我們會用到括號()來進行單元分組,進行重復(fù)內(nèi)容匹配(小括號后用+號)或指定內(nèi)容展示(用group(組號)或groups())的操作。

(3)group和groups的用法區(qū)別如下:

【m.group()】(這里m是search或者match后生成的對象)

m.group()可以括號內(nèi)不填內(nèi)容,也可以傳入一個數(shù)字N,即m.group(N)。以下分情況說明:

m.group() == m.group(0) == 展示匹配到的第一次滿足正則表達式pattern的全部內(nèi)容(所有匹配的字符)

這里直接展示匹配到的全部內(nèi)容,所以展示的就與括號無關(guān)了,這個是API規(guī)定的,例如'(book)+'的正則表達式可以對'yourbookbook'匹配展示出'bookbook'。

0>

返回第N組括號匹配的字符。(正則表達式內(nèi)有幾個()就有幾個分組)

m.group(1)、m.group(2)、... 的方式都只會展示()匹配到的對應(yīng)分組編號括號里的內(nèi)容,例如'(book)+'的正則表達式用m.group(1)對'yourbookbook'匹配也只會展示一個'book'(因為只有1組小括號,就只有1個分組)。

【m.groups()】

m.groups() 返回所有括號匹配的字符(正則表達式中有幾個括號就會有幾個分組的字符串內(nèi)容展示),以tuple格式作為容器返回。

m.groups() == (m.group(1), m.group(2), ...)

什么,還看不懂?

看來💊不能停,逐個分析吧:

首先,分析下正則表達式book+和(book+)

search對于'mebookbookme'字符串,用book+或者(book+)這樣的正則表達式匹配到全部內(nèi)容本來就是'book'

(因為這里+號是僅對k這個字母來匹配重復(fù)的,別搞混了)

>>> re.search('book+', 'mebookbookme')<_sre.sre_match object span="(2," match="book">

>>> re.search('(book+)', 'mebookbookme')<_sre.sre_match object span="(2," match="book">

所以不管groups()還是group(),都是'book'(一個book)

而search對于(book)+匹配到的全部內(nèi)容是'bookbook'

>>> re.search('(book)+', 'mebookbookme')<_sre.sre_match object span="(2," match="bookbook">

使用group()是把正則匹配到的內(nèi)容都展示,即返回'bookbook'

>>> re.search('(book)+', 'mebookbookme').group()'bookbook'

使用group(1)是把第一個(當(dāng)然這里正則只有一個)小括號里匹配的內(nèi)容展示,即返回'book'

使用groups()是把所有小括里匹配的內(nèi)容以元組打包了返回(當(dāng)然這里只有一個小括號),即返回('book',)

>>> re.search('(book)+', 'mebookbookme').groups()

('book',)

3.?使用findall中匹配分組小括號()后帶+的例子,和group(1)、groups()展示的類似

就是正則表達式里()后+號匹配到的重復(fù)內(nèi)容是不會展示的,只會展示小括號內(nèi)的一次內(nèi)容,說白了就是正則表達式里有幾個小括號()就展示幾個括號()內(nèi)的匹配內(nèi)容。當(dāng)然這里正則表達式里只有一個小括號(),所以findall返回列表的每個元素就是一個字符串'book'

>>> re.findall('(book)+', 'mebookbookme')

['book']>>> re.findall('(book+)', 'mebookbookme')

['book', 'book']

★第一個findall對(book)+的展示,直接把+號重復(fù)的分組合并為一個單元來展示(這個跟search的groups對于(book)+的展示是一樣的)

★第二個findall對(book+)的展示,則是把所有分組都展示出來

再加點💊,補充一個例子來說明一下findall:

下面的例子不管字符串中'ab'和'c'重復(fù)幾次,都只會展示一個'ab'和一個'c',當(dāng)然之所以返回了兩個元組,是因為findall

>>> re.findall('(ab)+(c)+', 'abcc123ababcccc')

[('ab', 'c'), ('ab', 'c')]

如果我們是要對'mebookbookme'匹配出'bookbook',怎么做呢?

1. 首先分析的是用match、search還是findall?

'mebookbookme'中'bookbook'不是出現(xiàn)在第一個字母開始的,所以不能用match;

'bookbook'模式只出現(xiàn)了一次(當(dāng)然也就是第一次出現(xiàn)'bookbook'模式),因此可以用search匹配到;

當(dāng)然findall能匹配到所有出現(xiàn)的'bookbook'模式,是肯定能用的。

2. 具體分析:

(1)使用search

使用'(book)+'的方式來search,匹配到的完整內(nèi)容就是'bookbook',選用group()或group(0)返回完整內(nèi)容就可以了。

>>> re.search('(book)+', 'mebookbookme').group()'bookbook'

>>> re.search('(book)+', 'mebookbookme').group(0)'bookbook'

如果要使用group(1)或groups()[0]呢,該用什么正則表達式?

可以使用'((?:book)+)'的非捕獲組(非編號組)的方式,即(?:表達式)的形式,這個小括號是沒有進入分組編號的。外頭之所以還要加個小括號,就是因為我們一旦用了group(1)或groups()[0]這樣的方式,必須要有編號為1的小括號分組。

(PS:當(dāng)然這個例子這樣做太麻煩,肯定不會選用這種方式,只是為了說明用法)

>>> re.search('((?:book)+)', 'mebookbookme').group(1)'bookbook'

>>> re.search('((?:book)+)', 'mebookbookme').groups()[0]'bookbook'

(2)使用findall

使用findall如果搭配小括號分組的話由于同樣會只返回小括號里的內(nèi)容,所以不能用'(book)+'的正則表達式,但可以采用非捕獲組(非編號組)的方式。

>>> re.findall('(?:book)+', 'mebookbookme')

['bookbook']>>> re.findall('(?:book)+', 'mebookbookme')[0]'bookbook'

總結(jié)

以上是生活随笔為你收集整理的python re match groups_【原创】如何治疗使用python中re模块group、groups与findall分组匹配后产生的“眩晕反应”...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。