Python3正则表达式之贪婪模式与非贪婪模式

前言

正则表达式是一个特殊字符序列,主要是帮助用户检索一个字符串是否与某种模式匹配或者在txt文档中检测匹配的字符串序列,然后将删除或者替换,在日常变种中我们也经常会进行字符查找和替换,这些的实现就是通过正则表达式提供的。关于正则表达式的使用,可以参考https://blog.csdn.net/m0_37852369/article/details/78829174https://blog.csdn.net/m0_37852369/article/details/78838498。此处我主要介绍一下自己的见解并且作为学习过程的一个记录。

1.何为贪婪?何为非贪婪?

在Python语言和大多数程序语言的数量词默认是贪婪的(少量默认非贪婪),贪婪模式总是尝试匹配尽可能多的字符,而非贪婪模式刚好相反,其总是尝试匹配尽可能烧得字符。

具体看下面的例子:

import re

string = 'abbbc'
pattern_greed = re.compile('\w+')
pattern_nogreed = re.compile('\w+?')
pg = pattern_greed.match(string)
pn = pattern_nogreed.match(string)
print(pg.group())
print(pn.group())

输出结果为:

贪婪模式输出结果为: abbbc
非贪婪模式输出结果为: a

可以看出,在不加“?”的情况下输出最大匹配项,即为贪婪模式,而加了“?”的时候,输出为a为最小匹配项。

2.使用方法

在python语言中默认贪婪模式,要使用非贪婪模式则需加“?”,下表是常用的几种正则表达式符号:

符号

含义
\d匹配一个数字字符
\w匹配包括下划线的任意单词字符
+前一个字符至少出现一次
*前一个字符出现次数大于等于零次(可出现无数次,也可不出现)
非贪婪模式标志,进行最小匹配(配合+,*使用),前一个字符出现0次或1次
{m}前一个字符出现m次
{m, n}前一个字符出现至少m次,至多n次

3.分析

下面具体讲一下上面例子的结果:

贪婪模式:正则表达式为"\w+",即包括下划线的任意单词字符出现至少一次或多次,因为是贪婪匹配,会尽可能的匹配,因而结果就为abbbc,其都是单词字符,再看下面的例子:

import re

string = 'abbbc'
pattern_greed = re.compile('ab+')
pg = pattern_greed.match(string)
print('贪婪模式输出结果为:', pg.group())

结果为:

贪婪模式输出结果为: abbb

这个正则表达式'+'的前一个字符为b,则b出现至少一次或无穷次,在贪婪模式下,在'abbbc'中匹配'ab'的最大项即为'abbb',与输出结果相同。

非贪婪模式:在第一个例子中正则表达式为"\w+?",'\w'表示包括下划线的任意单词字符出现至少一次或多次,又'?'表示为非贪婪模式,因而会去尽可能匹配最小的项,得到最终结果'a'。再看下面的例子:

import re

string = 'abbbc'
pattern_nogreed = re.compile('ab+?')
pn = pattern_nogreed.match(string)
print('非贪婪模式输出结果为:', pn.group())

输出结果:

非贪婪模式输出结果为: ab

这个正则表达式'+'的前一个字符为b,则b出现至少一次或无穷次,在非贪婪模式下,在'abbbc'中匹配'ab'的最小项即为'ab',与输出结果相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值