python re match groups_【原创】如何治疗使用python中re模块group、groups与findall分组匹配后产生的“眩晕反应”...
直接先上例子
>>> 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']
是不是被整暈了?
這時(shí),你需要來(lái)點(diǎn)理論💊回下血:
1. 首先要明白:
search、match與findall在對(duì)正則表達(dá)式上匹配次數(shù)的區(qū)別:
search和match(從頭開始匹配)都是只匹配字符串中第一次滿足正則表達(dá)式pattern的內(nèi)容
findall則是直接把字符串中所有滿足正則表達(dá)式pattern的內(nèi)容匹配出來(lái)
2. 其次要弄明白:
(1)group和groups是兩個(gè)不同的函數(shù),他們都是搭配search和match后的匹配對(duì)象來(lái)使用的,因此只會(huì)匹配出字符串中第一次滿足正則表達(dá)式pattern的內(nèi)容。
(2)之所以用group和groups是因?yàn)樵谡齽t表達(dá)式中我們會(huì)用到括號(hào)()來(lái)進(jìn)行單元分組,進(jìn)行重復(fù)內(nèi)容匹配(小括號(hào)后用+號(hào))或指定內(nèi)容展示(用group(組號(hào))或groups())的操作。
(3)group和groups的用法區(qū)別如下:
【m.group()】(這里m是search或者match后生成的對(duì)象)
m.group()可以括號(hào)內(nèi)不填內(nèi)容,也可以傳入一個(gè)數(shù)字N,即m.group(N)。以下分情況說(shuō)明:
m.group() == m.group(0) == 展示匹配到的第一次滿足正則表達(dá)式pattern的全部?jī)?nèi)容(所有匹配的字符)
這里直接展示匹配到的全部?jī)?nèi)容,所以展示的就與括號(hào)無(wú)關(guān)了,這個(gè)是API規(guī)定的,例如'(book)+'的正則表達(dá)式可以對(duì)'yourbookbook'匹配展示出'bookbook'。
0>
返回第N組括號(hào)匹配的字符。(正則表達(dá)式內(nèi)有幾個(gè)()就有幾個(gè)分組)
m.group(1)、m.group(2)、... 的方式都只會(huì)展示()匹配到的對(duì)應(yīng)分組編號(hào)括號(hào)里的內(nèi)容,例如'(book)+'的正則表達(dá)式用m.group(1)對(duì)'yourbookbook'匹配也只會(huì)展示一個(gè)'book'(因?yàn)橹挥?組小括號(hào),就只有1個(gè)分組)。
【m.groups()】
m.groups() 返回所有括號(hào)匹配的字符(正則表達(dá)式中有幾個(gè)括號(hào)就會(huì)有幾個(gè)分組的字符串內(nèi)容展示),以tuple格式作為容器返回。
m.groups() == (m.group(1), m.group(2), ...)
什么,還看不懂?
看來(lái)💊不能停,逐個(gè)分析吧:
首先,分析下正則表達(dá)式book+和(book+)
search對(duì)于'mebookbookme'字符串,用book+或者(book+)這樣的正則表達(dá)式匹配到全部?jī)?nèi)容本來(lái)就是'book'
(因?yàn)檫@里+號(hào)是僅對(duì)k這個(gè)字母來(lái)匹配重復(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'(一個(gè)book)
而search對(duì)于(book)+匹配到的全部?jī)?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)是把第一個(gè)(當(dāng)然這里正則只有一個(gè))小括號(hào)里匹配的內(nèi)容展示,即返回'book'
使用groups()是把所有小括里匹配的內(nèi)容以元組打包了返回(當(dāng)然這里只有一個(gè)小括號(hào)),即返回('book',)
>>> re.search('(book)+', 'mebookbookme').groups()
('book',)
3.?使用findall中匹配分組小括號(hào)()后帶+的例子,和group(1)、groups()展示的類似
就是正則表達(dá)式里()后+號(hào)匹配到的重復(fù)內(nèi)容是不會(huì)展示的,只會(huì)展示小括號(hào)內(nèi)的一次內(nèi)容,說(shuō)白了就是正則表達(dá)式里有幾個(gè)小括號(hào)()就展示幾個(gè)括號(hào)()內(nèi)的匹配內(nèi)容。當(dāng)然這里正則表達(dá)式里只有一個(gè)小括號(hào)(),所以findall返回列表的每個(gè)元素就是一個(gè)字符串'book'
>>> re.findall('(book)+', 'mebookbookme')
['book']>>> re.findall('(book+)', 'mebookbookme')
['book', 'book']
★第一個(gè)findall對(duì)(book)+的展示,直接把+號(hào)重復(fù)的分組合并為一個(gè)單元來(lái)展示(這個(gè)跟search的groups對(duì)于(book)+的展示是一樣的)
★第二個(gè)findall對(duì)(book+)的展示,則是把所有分組都展示出來(lái)
再加點(diǎn)💊,補(bǔ)充一個(gè)例子來(lái)說(shuō)明一下findall:
下面的例子不管字符串中'ab'和'c'重復(fù)幾次,都只會(huì)展示一個(gè)'ab'和一個(gè)'c',當(dāng)然之所以返回了兩個(gè)元組,是因?yàn)閒indall
>>> re.findall('(ab)+(c)+', 'abcc123ababcccc')
[('ab', 'c'), ('ab', 'c')]
如果我們是要對(duì)'mebookbookme'匹配出'bookbook',怎么做呢?
1. 首先分析的是用match、search還是findall?
'mebookbookme'中'bookbook'不是出現(xiàn)在第一個(gè)字母開始的,所以不能用match;
'bookbook'模式只出現(xiàn)了一次(當(dāng)然也就是第一次出現(xiàn)'bookbook'模式),因此可以用search匹配到;
當(dāng)然findall能匹配到所有出現(xiàn)的'bookbook'模式,是肯定能用的。
2. 具體分析:
(1)使用search
使用'(book)+'的方式來(lái)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]呢,該用什么正則表達(dá)式?
可以使用'((?:book)+)'的非捕獲組(非編號(hào)組)的方式,即(?:表達(dá)式)的形式,這個(gè)小括號(hào)是沒(méi)有進(jìn)入分組編號(hào)的。外頭之所以還要加個(gè)小括號(hào),就是因?yàn)槲覀円坏┯昧薵roup(1)或groups()[0]這樣的方式,必須要有編號(hào)為1的小括號(hào)分組。
(PS:當(dāng)然這個(gè)例子這樣做太麻煩,肯定不會(huì)選用這種方式,只是為了說(shuō)明用法)
>>> re.search('((?:book)+)', 'mebookbookme').group(1)'bookbook'
>>> re.search('((?:book)+)', 'mebookbookme').groups()[0]'bookbook'
(2)使用findall
使用findall如果搭配小括號(hào)分組的話由于同樣會(huì)只返回小括號(hào)里的內(nèi)容,所以不能用'(book)+'的正則表達(dá)式,但可以采用非捕獲組(非編號(hào)組)的方式。
>>> re.findall('(?:book)+', 'mebookbookme')
['bookbook']>>> re.findall('(?:book)+', 'mebookbookme')[0]'bookbook'
總結(jié)
以上是生活随笔為你收集整理的python re match groups_【原创】如何治疗使用python中re模块group、groups与findall分组匹配后产生的“眩晕反应”...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: win10无法装载iso文件_win 1
- 下一篇: lua如何打印行号_双11购物清单,你打