正则表达式种常用的量词X+(1个或多个)、X*(0个或1多个)、X?(0个或1个)
正则表达式默认为贪婪模式,量词要匹配使整个匹配成功的最大可能的重复次数。非贪婪匹配也就是使匹配最小的重复次数。
贪婪匹配的过程根据正则表达式的复杂程度有可能产生回溯:
示例
此python代码的打印结果为:bb(不清楚贪婪匹配的过程就可能想不明白)
1. .* 为贪婪模式,匹配尽可能多的字符,所以直接匹配到了字符串末尾。
2. 剩余的正则表达式仍需要匹配,从末尾开始回溯。找到倒数第一个b以后,继续向后匹配 .* 。
3. .* 后面的b无法匹配,又产生回溯,找到倒数第一个b,之前的b向前移,仍保持之前匹配的最大数量。
4. 最后的 . * 匹配字符串到末尾。
验证:
输出为:bbb
非贪婪匹配:使用?量词将匹配转为非贪婪匹配。即从字符串的起始处开始,从左至右,依次匹配正则表达式里的字符,满足当前匹配的部部分则中止。
例:
输出为: booooobaaaobbbb。
? 将.*转换为非贪婪模式,用最小的重复次数来进行匹配,匹配结果为空字符,往后匹配贪婪的b.*b,得到最大长度的开头与结尾的字符串。
输出结果为: booooob。
提取部分得到字符串从左至右最先满足条件的子字符串(最小次数的匹配)。