import re
r=re.compile(r'ab\s[\dt\d,]*[\dt\d]+\scd')
r.search('ab 1t2,2t3,3t4,4t5,88,5t6,7t8,9t10,10t11 cd')
#输出结果是整个字符串匹配成功,但我并不理解为什么可以匹配成功!
我的目的是匹配类似于这样的一个字符串:'ab 数字t数字,数字t数字,数字t数字...数字t数字 cd'
也就是[数字t数字]的结构很多次,当然,逗号也要被重复,但最后一个[数字t数字]右边必须没有逗号,而是直接接空格,所以对于重复的结构,我写了[\dt\d,]*[\dt\d]
这样的代码,确保该重复结构最后一次出现时右边没有逗号。
本来我觉得这个结构十分完美,但是在下面打字符串测试的时候,不小心把8t8之间的t漏掉了,导致那一组逗号之间只有一个纯数字:88,按照我\dt\d
的代码,纯数字是不可能被匹配到的,必须中间有个t才能被匹配到,可这么一执行,居然还成功了,令我百思不得其解!
我自己完美解决了,哈哈!!!!!答案如下:
简单来说,我一开始就把圆括号的子表达式用法和中括号的混淆了。实际上,中括号里的所有规则都是或然关系,也就是说一个中括号只能最终匹配一个字符!只有圆括号括起来的一组才能代表多个字符!
另外
\dt\d
并不能完全代表“两个数字夹一个字母t”,只能代表“两个个位数夹一个字母t”,也就是说,类似于11t12这样的字符是无法匹配的。为了防止bug,可以变成d+td+没想到来这里的第一个答案居然是自己解决的,可能是我的题目描述的不够清楚吧。不过我已经不再害怕正则表达式了,哈哈!