来说上次的习题:
1 2 3 4 | (021)88776543 010-55667890 02584453362 0571 66345673 |
一个可以匹配出所有结果的表达式是
1 | \(?0\d{2,3}[) -]?\d{7,8} |
解释一下:
1 | \(? |
()在正则表达式里也有着特殊的含义,所以要匹配字符”(“,需要用”\(“。?表示这个括号是可有可无的。
1 | 0\d{2,3} |
区号,0xx或者0xxx
1 | [) -]? |
在区号之后跟着的可能是”)”、” “、”-“,也可能什么也没有。
1 | \d{7,8} |
7或8位的电话号码
可是,这个表达式虽然能匹配出所有正确的数据(一般情况下,这样已经足够),但理论上也会匹配到错误的数据。因为()应当是成对出现的,表达式中对于左右两个括号并没有做关联处理,例如(02188776543这样的数据也是符合条件的。
我们可以用正则表达式中的“|”符号解决这种问题。“|”相当于python中“or”的作用,它连接的两个表达式,只要满足其中之一,就会被算作匹配成功。
于是我们可以把()的情况单独分离出来:
1 | \(0\d{2,3}\)\d{7,8} |
其他情况:
1 | 0\d{2,3}[ -]?\d{7,8} |
合并:
1 | \(0\d{2,3}\)\d{7,8}|0\d{2,3}[ -]?\d{7,8} |
使用“|”时,要特别提醒注意的是不同条件之间的顺序。匹配时,会按照从左往右的顺序,一旦匹配成功就停止验证后面的规则。假设要匹配的电话号码还有可能是任意长度的数字(如一些特殊的服务号码),你应该把
1 | |\d+ |
这个条件加在表达式的最后。如果放在最前面,某些数据就可能会被优先匹配为这一条件。你可以写个测试用例体会一下两种结果的不同。
声明:
本文采用
BY-NC-SA
协议进行授权,如无注明均为原创,转载请注明转自
个人编程学习网
本文地址: Python-正则表达式(5)
本文地址: Python-正则表达式(5)
您必须 登录 才能发表评论