当前位置: 首页 > Web前端 > JavaScript

正则表达式中一些难以理解的匹配方式

时间:2023-03-27 00:46:52 JavaScript

(?:pattern)()意思是抓取一个组,()会在每个组中保存匹配的值,从左到右,以组的左括号为Flag,出现的第一个组的组号为1,第二个组号为2,以此类推(?:)表示非捕获组,与捕获组的唯一区别是非捕获组匹配的值组不会被保存importrea="123abc456ww"pattern="([0-9]*)([a-z]*)([0-9]*)"print(re.search(pattern,a).group(0,1,2,3))pattern="(?:[0-9]*)([a-z]*)([0-9]*)"print(re.search(pattern,a).group(0,1,2))可以看出,(?:[0-9])匹配到的第一个[0-9]没有保存,也就是匹配到的“123”没有保存,但是([0-9]*)被保存下来。python中的group(0)返回匹配的整体(?:pattern),这在使用“或”字符(|)组合模式的各个部分时很有用。例如,'industr(?:y|ies)'是比'industry|industries'更短的表达式。由于我们单独存储“y”或“ies”,因此没有意义)/*{0:"industry"groups:undefinedindex:8input:"Britishindustry"}*/pattern="industr(y|ies)"print(re.search(pattern,a).group(0,1))//group(1)会报错,因为捕获的“y”(?=pattern)没有保存,前瞻肯定断言(lookaheadpositiveassert)匹配到pattern前面的位置。简单来说,以xxx(?=pattern)为例,就是抓取以pattern结尾的内容xxx1。这是一个非获取匹配,即匹配不需要获取以备后用。industr(?=y|ies)--->"industr"2.预搜索不消耗字符,即发生一次匹配后,在上一次匹配后立即开始搜索下一次匹配,而不是从包含预览在字符之后开始。(?!pattern)与任何不匹配模式的字符串开头的搜索字符串相匹配的肯定否定断言。这是一个非获取匹配,即匹配不需要获取以备后用。简单来说,以xxx(?!pattern)为例,就是抓取不以pattern结尾的内容。例如,“Windows(?!95|98|NT|2000)”可以匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。Lookaheads不消耗字符,也就是说,在匹配发生后,搜索下一个匹配项会在最后一个匹配项之后立即开始,而不是在包含lookahead的字符之后。(?<=pattern)Reverse(向后看)positivepre-check与positive正向预检类似,只是方向相反。简单来说,以(?<=pattern)xxx为例,就是抓取patternxxx开头的内容。例如,“(?<=95|98|NT|2000)Windows”匹配“2000Windows”中的“Windows”,但不匹配“3.1Windows”中的“Windows”。(?