Python用Phonenumbers库将UK手机号转E.164校验报错如何解决?
问题根源
phonenumbers.is_possible_number()方法要求入参是phonenumbers.parse()解析后返回的 PhoneNumber对象,你传入的cleaner_phone是format_number输出的E.164格式字符串,自然会触发属性不存在的报错。- 校验逻辑顺序错误:应该先校验解析后的PhoneNumber对象是否合法,合法的前提下再做格式转换输出E.164字符串,避免无效号码做无用的格式化操作。
修正后代码
import phonenumbers def format_and_validate_gb_phone(raw_phone): try: # 第一步:解析原始号码为PhoneNumber对象 parsed_phone = phonenumbers.parse(raw_phone, "GB") # 第二步:先校验号码有效性,双层校验结果更准确 is_valid = phonenumbers.is_possible_number(parsed_phone) and phonenumbers.is_valid_number(parsed_phone) if not is_valid: return None, False # 第三步:校验通过再格式化为E.164标准格式 e164_phone = phonenumbers.format_number(parsed_phone, phonenumbers.PhoneNumberFormat.E164) return e164_phone, True except phonenumbers.NumberParseException: # 原始输入格式不符合号码规则,直接返回无效 return None, False # 测试调用 if __name__ == "__main__": test_num = '+4407808765066' cleaned_num, valid = format_and_validate_gb_phone(test_num) if valid: print(f"有效号码:{cleaned_num}") else: print("无效英国手机号码")
补充说明
is_possible_number仅校验号码长度是否符合对应国家规则,is_valid_number会进一步校验号段、格式规则等内容,两者搭配使用可以大幅降低误判概率。
同时新增的异常捕获可以处理原始输入包含非号码字符、格式完全错误的情况,避免程序直接崩溃。
内容的提问来源于stack exchange,提问作者andyhughes73
相关产品推荐
相关产品推荐

