如何使用phonenumbers模块校验任意国家的手机号码有效性?
全国家/地区手机号校验实现方案
场景1:号码带+开头的国际前缀
如果待校验的号码本身包含国际区号标识(比如+8613800138000、+12025550109),直接省略phonenumbers.parse的第二个地区参数即可,模块会自动根据号码前缀匹配对应国家的校验规则:
import phonenumbers def is_valid_global_phone(phone_str: str) -> bool: try: # 地区参数传None,自动识别带国际前缀的号码 phone_obj = phonenumbers.parse(phone_str, None) return phonenumbers.is_valid_number(phone_obj) except phonenumbers.NumberParseException: return False # 测试用例 print(is_valid_global_phone("+8613800138000")) # 中国手机号,返回True print(is_valid_global_phone("+12025550109")) # 美国手机号,返回True print(is_valid_global_phone("+447911123456")) # 英国手机号,返回True
场景2:号码无国际前缀(纯数字)
如果输入的是没有+前缀的纯数字号码,需要遍历phonenumbers支持的所有国家/地区代码,逐个校验是否符合对应地区的手机号规则:
import phonenumbers # 获取phonenumbers支持的所有国家/地区代码 ALL_SUPPORTED_REGIONS = list(phonenumbers.SUPPORTED_REGIONS) def check_phone_without_prefix(phone_str: str) -> tuple[bool, str]: """返回结果:(是否为有效手机号, 匹配到的国家/地区代码),无匹配返回(False, '')""" for region in ALL_SUPPORTED_REGIONS: try: phone_obj = phonenumbers.parse(phone_str, region) if phonenumbers.is_valid_number(phone_obj): # 额外校验号码类型为手机号,排除固定电话,不需要可以删掉这行判断 if phonenumbers.number_type(phone_obj) == phonenumbers.PhoneNumberType.MOBILE: return True, region except phonenumbers.NumberParseException: continue return False, "" # 测试用例 print(check_phone_without_prefix("13800138000")) # 返回 (True, 'CN') print(check_phone_without_prefix("9876543210")) # 印度手机号,返回 (True, 'IN')
注意事项
- 纯数字无前缀的号码可能同时符合多个地区的规则,上述代码返回第一个匹配到的地区,你可以根据业务需要调整为返回所有匹配的地区列表
- 不需要区分手机号和固定电话的场景,直接删除
number_type相关的判断即可
内容的提问来源于stack exchange,提问作者albusdemens
相关产品推荐
相关产品推荐

