前言
正则表达式是一个特殊字符序列,主要是帮助用户检索一个字符串是否与某种模式匹配或者在txt文档中检测匹配的字符串序列,然后将删除或者替换,在日常变种中我们也经常会进行字符查找和替换,这些的实现就是通过正则表达式提供的。关于正则表达式的使用,可以参考https://blog.csdn.net/m0_37852369/article/details/78829174和https://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',与输出结果相同。