今天听到一句话,觉得很在理——"当你遇到一个问题,想到用正则表达式解决时,就变成了两个问题"
这也从侧面说明了正则表达式比较难理解。下面我将用通俗易懂的方式总结一下,最近遇到的一些正则表达式的问题
一. 贪婪匹配的"毛病"
1. 太贪婪就"歇菜"了
匹配模式为r".*(\d*).*",在这个模式中,(\d*)表示贪婪匹配,匹配前面的字符\d,也就是数字0次或无数次,但是我们的字符串中,\d匹配无数次的情况是不存在的(实际上对于search方法,它会找到"1",如果"11"不满足"1"匹配无数次,那么它就会选择匹配 "1" 0次,匹配0次后就直接返回了),因此,(\d*)表示的是匹配前面的数字0次,既然是0次,那么返回的分组的内容应该是空字符串‘‘,group(1)和groups()都能验证这一点,比如group(1)代表返回第1个分组的字符串,groups()返回一个包含所有小组字符串的元组,由于本例中只有一个分组,分组号为1,因此,我们可以看出得到的是空字符串‘‘
但是,有人又问了,为什么.group()看到的是匹配整个字符串?事实上,我们的分组——匹配前面的数字0次——是不起任何作用的,就相当于匹配模式是r".*.*",不信请看下图,结果是不是一模一样?
举个例子,匹配模式是很爱财的朋友,我的银行余额是字符串,有一天他突然向我借钱,哥们,能不能借我很多钱?
我问,具体多少?他说,当然是越多越好啊,呵呵,这个贪心的人。我查询账户余额,一瞅,只剩下10万了,当然选择不借给他!因此我知道他贪得无厌,我自己如果借给他10万,他会问我要20万,30万...甚至更多,所以,对于利欲熏心的朋友,我是拒绝的——最后他一分钱也没拿到,得到的是空(空字符串‘‘)。于是,这位朋友算是看了一眼我的账户余额(search()),灰溜溜的走了
2. "疑心重重"的贪婪
有一天,这个朋友又来了,这次他的疑心又加重了一些,他又向我借钱,哥们,能不能借我很多钱?
我掏出手机查了一下账户余额,上面写着大约"10万",这位朋友就是不死心,明明是不能满足他的贪心,他还死缠着我不放,非要我查清楚具体的明细给他看,而且要精确到小数点之后的几角几分,第一次,我告诉他大约10万,不能借给他,他拿到了空(空字符串‘‘),第二次,当我查询具体明细时,上面显示"101283.88"元,我再次拒绝了他,他又拿了一次空,这就是findall()的作用,返回所有能匹配到的子串
二. 贪婪的"顿悟"
1. "请把贪婪交给别人"
我的朋友在多次借钱无果的情况下,经过我苦口婆心的劝说,终于有点醒悟了,他打算洗心革面,做一个清心寡欲的人
有一天,他突然来找我,哥们,能不能借我点钱,两位数的都成
我一听,妈呀,这改变颇大,得了,借他99块钱还是没问题的,正要掏出99元时,他突然拦住我,表示要看我的账户余额
惊出一身冷汗,但还是抱着信任他的态度,把手机给他,他看了账户余额,"101283.88"元,缓缓地说道,你能借我8毛8吗?
当然可以——我松了一口气,有点怀疑的望着他,对了,你的贪婪哪里去了?
他不假思索的说,我把贪婪给了别人——我们贪婪家族,辈分排在我前面的那个".*",有了他,我可以不背负贪婪的恶名,我只会找到最后面的两位数,对你的余额来说,应该是最少的
2. 非贪婪——"大家都不贪了,才能实现互惠"
有一天,我的朋友开心的跑来找我,说他的前辈也洗心革面了,开始慢慢习惯清贫、习惯满足
我知道,这是我朋友的功劳。当他得到欲望的危害后,他也向布道师一样向前辈们传递这种思想
他的前辈就接收了他的洗礼,并且还刻意在帽子上画了一个"?"的标记,那是他独有的限制自我的符号
当然,这次朋友也是来向我借钱的,哥们,能不能给我借点钱,两位数的都行,就像上次的语气一样
我这时卡里还有"199.88"元,为什么只剩下这么点?是因为最近去炒股了
于是,我拿出99元,最大的两位数给他,跟他说——快收下,这是你应得的
现在他也不仔细查看我的余额明细了,瞄了一眼大概的余额就收下了。的确,他在一天天进步...
原文地址:https://www.cnblogs.com/cnhkzyy/p/9211504.html