vainquit
2019-06-28 19:13
采纳率: 78.4%
浏览 578

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

import re

r=re.compile(r'/re\s[\dt\d,?]+\srpl\d')

r.search('/re 5t10,11t55,58t62,88,67t77 rpl2')

输出:<_sre.SRE_Match object; span=(0, 34), match='/re 5t10,11t55,58t62,88,67t77 rpl2'>

我的重点主要是放在该字符串中间的重复部分,例如5t10,11t55,58t62等,也就是前后两个数字夹中间一个t的、后面再跟个逗号——这个结构可以重复很多次。这个表达式我写出来了,但是我不知道中间那个纯数字88为什么可以匹配成功,它中间又没有t,凭什么会被匹配到?我实在是想不明白,我的代码明明写的就是
\dt\d,两个数字中间一个t,怎么就会有纯数字可以匹配到呢?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • vainquit 2019-06-29 01:07
    已采纳

    我明白了,我终于明白了!!!正解(另外加了个限定条件:不可在最后一组重复结构的右边出现逗号,而要紧接空格):

    import re
    r=re.compile(r'/re\s(\d+t\d+,)*(\d+t\d+)\srpl\d')
    r.search('/re 5t10,11t55,58t62,8t8,67t77 rpl2')

    总结一下,我在这个题目中总共犯了2个显著的错误。
    第一,最大的错误是,我误解了中括号对[]的功能,我不知道中括号里所有的字符都是或然关系,也就是说,一个中括号里的所有字符其实最终只代表一个字符。
    [\dt\d]* 的意思并不是两个数字夹一个字母t重复一次或者0次;这个表达本身就是错误的,原因就如同上面所说,中括号里所有字符都是并列的、或然的,所以都不可以有两个|d,只需要一个。这个时候,[\dt]*的含义就变成了:一个数字或者一个字母t,重复任意次。

    两个数字夹一个字母t,这其实已经不是一个数字了,已经不可以用中括号来表示了,它是3个数字,是一组数字,是一组子表达式,应该直接使用圆括号把\dt\d括起来,成为(\dt\d),它们才是两个数字夹一个字母t,再使用*来使得这一组3个数字同时重复任意多次。

    第二,即便我解决了上面的错误,我还忽视了另外一个小错误,那就是:\dt\d虽然匹配两个数字夹一个字母,但只能匹配个位数的数字,也就是说1t2可以匹配,而11t55就不行,因为11是数字1后面紧接着数字1,而不是十一;55是数字5后面跟着另外一个数字5,而不是五十五!所以就要写成\d+t\d+才对!

    正则表达式真是奇妙的东西,我学会了,终于不会再害怕了,哈哈

    点赞 打赏 评论

相关推荐 更多相似问题