不管是贪婪模式,还是非贪婪模式,匹配过程中都需要发生回溯才能完成想要的功能,但是在有一些场景,我们不需要回溯,匹配不上直接返回失败就可以了,因此正则匹配中还有另外一种模式,独占模式,它和贪婪模式很像,但匹配过程中不会发生回溯,在一些使用场景中性能会更好。
先来讲讲什么是回溯,再举个栗子,有一个正则表达式和目标字符串,我们分别看下在三种匹配模式下都发生了什么:
5.1 贪婪匹配过程正则表达式:ab{1,3}c
目标字符串:abbc
在匹配时,b{1,3} 会尽可能长的去匹配目标字符串,匹配完 abb 之后,因为要尽可能长的匹配(3个 b),目标字符串中的c就会匹配不上,这个时候会发生向前回溯,吐出当前字符 c,用正则中的 c 去匹配,匹配成功。
import regex print(regex.findall(r'ab{1,3}c', 'abbc')) 输出:['abbc']
5.2 非贪婪匹配过程正则表达式:ab{1,3}?c
目标字符串:abbc
在匹配时,b{1,3} 会尽可能短的去匹配目标字符串,匹配完 ab 之后,会直接用正则 c 去匹配目标字符串剩下的 b,匹配不上,发生向前回溯,重新用正则 b{1,3} 匹配 目标字符串剩下的 b,然后正则 c 匹配 目标字符串剩下的 c,匹配成功。
import regex print(regex.findall(r'ab{1,3}?c', 'abbc')) 输出:['abbc']
5.3 独占匹配过程在量词后面加上 + 就是独占模式。
正则表达式:ab{1,2}+bc
目标字符串:abbc
在匹配时,b{1,2} 会尽可能长的去匹配目标字符串,匹配完 abb 之后,会用正则 b 匹配目标字符串剩下的 c,匹配不上,不回溯,匹配失败。
import regex print(regex.findall(r'ab{1,2}+bc', 'abbc')) 输出:[]
6.写在最后最后在总结下上面讲到的内容:
到这里,正则表达式的量词与贪婪就讲完了,如果有问题可以给我留言评论,谢谢。
正则表达式在线校验工具:https://regex101.com/
到此这篇关于正则表达式量词与贪婪的使用详解的文章就介绍到这了,更多相关正则表达式 量词与贪婪内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章: