python中使用re模块search、match与findall的区别及group()、groups、gruop(N)之间的关系 转载:https://www.cnblogs.com/oce

1、search、match与findall在对正则表达式上匹配次数的区别:

search和match(从头开始匹配)都是只匹配字符串中第一次满足正则表达式pattern的内容

findall则是直接把字符串中所有满足正则表达式pattern的内容匹配出来

2、关于group和groups

group和groups是两个不同的函数,他们都是搭配search和match后的匹配对象来使用的,因此只会匹配出字符串中第一次满足正则表达式pattern的内容。

之所以用group和groups是因为在正则表达式中我们会用到括号()来进行单元分组,进行重复内容匹配(小括号后用+号)或指定内容展示(用group(组号)或groups())的操作。

2、关于group()和group(N)

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

m.group()可以括号内不填内容,也可以传入一个数字N,即m.group(N)。以下分情况说明:

<不传入N或传入N=0>

m.group() == m.group(0) == 展示匹配到的第一次满足正则表达式pattern的全部内容(所有匹配的字符)

这里直接展示匹配到的全部内容,所以展示的就与括号无关了,这个是API规定的,例如'(book)+'的正则表达式可以对'yourbookbook'匹配展示出'bookbook'。

<传入N>0>

返回第N组括号匹配的字符。(正则表达式内有几个()就有几个分组)

但m.group(1)、m.group(2)、... 之后的分组都只会展示()匹配到的分组括号里的内容,例如'(book)+'的正则表达式用m.group(1)对'yourbookbook'匹配也只会展示一个'book'(因为只有1组小括号,就只有1个分组)。

【m.groups()】

m.groups() 返回所有括号匹配的字符(正则表达式中有几个括号就会有几个分组的字符串内容展示),以tuple格式作为容器返回。

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

3、使用findall中匹配分组小括号()后带+的例子,和group(1)、groups()展示的类似

就是正则表达式里()后+号匹配到的重复内容是不会展示的,只会展示小括号内的一次内容,说白了就是正则表达式里有几个小括号()就展示几个括号()内的匹配内容。当然这里正则表达式里只有一个小括号(),所以findall返回列表的每个元素就是一个字符串'book'

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

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

第一个findall对(book)+的展示,直接把+号重复的分组合并为一个单元来展示(这个跟search的groups对于(book)+的展示是一样的)

★第二个findall对(book+)的展示,则是把所有分组都展示出来

再一个例子:

re.findall('(ab)+(c)+', 'abcc123ababcccc')  # [('ab', 'c'), ('ab', 'c')]

4、如果我们是要对'mebookbookme'匹配出'bookbook',怎么做呢?

a. 首先分析的是用match、search还是findall?

'mebookbookme'中'bookbook'不是出现在第一个字母开始的,所以不能用match;

'bookbook'模式只出现了一次(当然也就是第一次出现'bookbook'模式),因此可以用search匹配到;

当然findall能匹配到所有出现的'bookbook'模式,是肯定能用的。

b. 具体分析:

(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]呢,该用什么正则表达式?

可以使用'((?: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)+'的正则表达式,但可以采用非捕获组(非编号组)的方式。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值