解剖一只麻雀,当正则表达式\w*匹配‘a-b‘的时候,到底发生了什么?

以Python3的re.findall(r'\w*','a-b')作为演示例证。

首先要明白\w*有两种匹配模式,多字符匹配(贪婪模式)和零字符匹配(懒惰模式)。

现在开始。第一步,NFA正则引擎让\w*去匹配a,匹配成功,findall返回a。接下来马不停蹄匹配-,因为-是非单词字符,匹配……不能说失败,\w*是不承认失败的,一定要成功。于是回溯,再次匹配-,因为上一次的贪婪模式没有配上,这次采用零字符模式,零字符模式自然成功,匹配空字符,返回空字符''。竟然成功了,趁热打铁匹配b,优先应用多字符匹配,成功返回b,最后来到字符末尾$,尾标记$和\w*匹配不上,\w+又一次不承认失败,坚持再次回溯,重新以零字符匹配,再次成功,第二次返回空字符。继续下一次匹配,但这时已经到达字符串末尾后面,整个匹配全部结束,最终findall返回列表['a','','b','']。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值