【Python 课堂】第59课—— 正则表达式(5)

    作者:在线学习平台更新于: 2014-10-16 10:25:17

    大神带你学编程,欢迎选课

    来说上次的习题:
    (021)88776543
    010-55667890
    02584453362
    057166345673
    一个可以匹配出在线学习所有结果的表达式是
    \(?0\d{2,3}[)-]?\d{7,8}
    解释一下:
    \(?
    ()在正则表达式里也有着特殊的含义,所以要匹配字符"(",需要用"\("。?表示这个括号是可有可无的。
    0\d{2,3}
    区号,0xx或者0xxx
    [)-]?
    在区号之后跟着的可能是")"、""、"-",也可能什么也没有。
    \d{7,8}
    7或8位的电话号码
    可是,这个表达式虽然能匹配出所有正确的数据(一般情况下,这样已经足够),但理论上也会匹配到错误的数据。因为()应当是成对出现的,表达式中对于左右两个括号并没有做关联处理技能培训,例如(02188776543这样的数据也是符合条件的。
    我们可以用正则表达式中的“|”符号解决这种问题。“|”相当于Python中“or”的作用,它连接的两个表达式,只要满足其中之一,就会被算作匹配成功。
    于是我们可以把()的情况单独分离出来:
    \(0\d{2,3}\)\d{7,8}
    其他情况:
    0\d{2,3}[-]?\d{7,8}
    合并:
    \(0\d{2,3}\)\d{7,8}|0\d{2,3}[-]?\d{7,8}
    使用“|”时,要特别提醒注意的是不同条件之间的顺序。匹配时,会按照从左往右的顺序,一旦匹配成功就停止验证后面的规则。假设要匹配的电话号码还有可能是任意长度的数字(如一些特殊的服务号码),你应该把
    |\d+
    这个条件加在表达式的最后。如果放在最前面,某些数据就可能会被优先匹配为这一条件。你可以写个测试用例体会一下两种结果的不同。
    关于正则表达式,我们已经讲了5篇,介绍了正则表达式最最皮毛的一些用法。接下来,这个话题要稍稍告一段落。推荐一篇叫做《正则表达式30分钟入门教程》视频教程的文章(直接百度一下就能找到,我也会转到论坛上),想要对正则表达式进一步学习的同学可以参考。这篇教程是个标题党,里面涉及了正则表达式较多的内容,30分钟绝对看不完。

     
    文章来源于Crossin,由课课家平台整理,转载请注明。

课课家教育

未登录