You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:15:03