实例1:判断手机号所属运营商
说到手机号大家并不陌生,一个手机号码由11位数字组成,前3位表示网络识别号,第4~7位表示地区编号,第8~11位表示用户编号。因此,我们可以通过手机号前3位的网络识别号辨别手机号所属运营商。在我国手机号运营商有移动、联通、电信,各大运营商的网络识别号如表1所示。
表1 运营商和网络识别号
运营商 | 号码段 |
移动 | 134、135、136、137、138、139、147、148、150、151、152、157、158、 159、165、178、182、183、184、187、188、198 |
联通 | 130、131、132、140、145、146、155、156、166、185、186、175、176 |
电信 | 133、149、153、180、181、189、177、173、174、191、199 |
本实例要求编写程序,实现判断输入的手机号码是否合法以及判断其所属的运营商的功能。
实例目标
- 掌握正则表达式的基本规则
- 掌握re模块中match()方法的用法
实例分析
判断一个手机号是否属于中国移动、中国联通、中国电信其中一家,首先需要判断用户输入的手机号码是否符合手机号码的规则,若符合规则再继续判断输入的手机号码具体属于哪个运营商。根据以上分析可整理出以下实现思路:
(1)接收用户输入的手机号码;
(2)使用if-else语句判断用户输入的手机号码是否符合规范:若符合规范,继续判断手机号码的所属运行商;若不符合规范,提示用户“请输入正确的手机号”。
以上思路中判断手机号所属运营商是程序处理的核心部分,此部分需要将用户输入的手机号码与表1中的号码段进行匹配,匹配成功则返回相应的运营商。因此,这里可以使用正则表达式进行匹配处理,即使用re模块的match()函数搜索用户输入的字符串是否有与正则表达式匹配的内容。
各运营商的号码段不同,其对应的正则表达式也不相同,具体可分为以下情况:
- 中国移动。中国移动的号码段按照不同的开头可分为13、14、15、16、17、18、19几种情况,每种情况对应的正则表达式为:
13[456789]\d{8}
15[012789]\d{8}
147\d{8}|178\d{8}
18[23478]\d{8}
- 中国联通:中国联通的号码段按不同的开头可分为13、14、15、16、17、18、几种情况,每种情况对应的正则表达式为:
13[012]\d{8}
18[56]\d{8}
15[56]\d{8}
176\d{8}
145\d{8}
- 中国电信:其余不匹配以上规则的字符串就是此运营商的手机号。
代码实现
import re
def phone_number():
n = input("请输入一个手机号:")
if re.match(r'1[34578]\d{9}', n):
print("该号码合法:", n)
# 中国移动:
if re.match(r"13[456789]\d{8}", n) or \
re.match(r"15[012789]\d{8}", n) or \
re.match(r"147\d{8}|178\d{8}", n) or \
re.match(r"18[23478]\d{8}", n):
print("该号码属于:中国移动")
# 中国联通
elif re.match(r'13[012]\d{8}', n) or \
re.match(r"18[56]\d{8}", n) or \
re.match(r"15[56]\d{8}", n) or \
re.match(r"176\d{8}", n) or \
re.match(r"145\d{8}", n):
print("该号码属于:中国联通")
else:
# 中国电信
print("该号码属于:中国电信")
else:
print("请输入正确的手机号")
if __name__ == '__main__':
phone_number()
上述代码首先使用import语句导入re模块,然后定义了查询手机运营商的函数phone_number(),在phone_number()函数中,先接收用户输入的手机号码并赋值给变量n,判断n是否符合手机号码的规则,符合规则再继续判断具体的运营商,最后在main语句中调用phone_number()函数。
代码测试
运行程序,在控制台输入“15732622380”的结果如下(号码合法):
请输入一个手机号:15732622380
该号码合法: 15732622380
该号码属于:中国移动
运行代码,在控制台输入“1573262238”的结果如下(号码不合法):
请输入一个手机号:1573262238
请输入正确的手机号