python 一个有趣的正则贪婪问题

先说问题

问题的关键就是{n,m}这种写法是贪婪的, 就是会尽量往m上靠

举例

比如我们想用正则匹配下面几个, 把年月日给挑出来

2020-01-02
2020-1-2
2020.01.02
2020 01 02
2020 1 2
2020/01/02
20200102

有没有发现, 如果除了最后一个, 我们都可以用非常简单的方法来做:

(\d+)[-. /](\d+)[-. /](\d+)

是不是很简单, 但是最后给我们来了一个20200102, tnnd, 中间一个分隔符都没有, 然后我心想这该怎么搞?, 还是先把中间的中括号匹配的特殊字符先加上一个?把, 匹配0个或者1个, 但是这样一来, 第一个\d+就能直接匹配到最后了

(\d+)[-. /]?(\d+)[-. /]?(\d+)

好, 我们继续该, 第一组数字匹配改成\d{4}

(\d{4})[-. /]?(\d+)[-. /]?(\d+)

这样也不行呀, 从第二组数字开始就能把20200102给直接匹配到最后了, 然后就有了这种写法

(\d{4})[-. /]?(\d{1, 2})[-. /]?(\d+)

为什么给第二组数字写上{1, 2}就能匹配到20200102呢?
结果有没有可能是2020, 0, 102 而不是2020, 01, 02呢, 不会的, 结果肯定是第二种
就是因为{n, m}这种写法是贪婪的, 我们写{1, 2} 他会金量往两个去匹配.

这里再推荐一下一个正则练习的网站:

编程胶囊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值