python正则表达式,匹配到了不希望匹配的东西,但不知道原因

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才能被匹配到,可这么一执行,居然还成功了,令我百思不得其解!

阅读 2.7k
1 个回答
✓ 已被采纳新手上路,请多包涵

我自己完美解决了,哈哈!!!!!答案如下:

import re

r=re.compile(r'ab\s(\d+t\d+,)*(\d+t\d+)+\scd')

r.search('ab 1t2,2t3,3t4,4t5,8t8,5t6,7t8,9t10,10t11 cd')

#输出,编译成功;若是把字符串的8t8改成88,则编译失败。

简单来说,我一开始就把圆括号的子表达式用法和中括号的混淆了。实际上,中括号里的所有规则都是或然关系,也就是说一个中括号只能最终匹配一个字符!只有圆括号括起来的一组才能代表多个字符!

另外\dt\d并不能完全代表“两个数字夹一个字母t”,只能代表“两个个位数夹一个字母t”,也就是说,类似于11t12这样的字符是无法匹配的。为了防止bug,可以变成d+td+

没想到来这里的第一个答案居然是自己解决的,可能是我的题目描述的不够清楚吧。不过我已经不再害怕正则表达式了,哈哈!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题