需求:编写Python手机号清洗函数,处理指定列表并返回合规结果
手机号清洗函数修正方案
需求说明
编写函数接收手机号列表,返回清洗后的列表,规则如下:
- 合规手机号需以
62开头,去掉62后剩余部分为11位数字 - 清洗后仍不符合规则的号码替换为
'Invalid Number'
测试输入
phone = [ '82123321123', '082321123321', '+6282-456-654-456', '+62 82 789 987 789', '14045', '82145-451-145' ]
预期输出
[6282123321123, 6282321123321, 6282456654456, 6282789987789, 'Invalid Number', 6282145451145]
原代码问题分析
原代码存在多处逻辑错误:
- 盲目给所有号码添加
62前缀,忽略了部分号码本身已带+62的情况,导致前缀重复 - 使用
translate方法时参数错误,且生成的处理结果未赋值回原数组,等于没执行清洗操作 - 缺少合规性校验逻辑,无法识别无效号码并替换
- 函数未返回处理结果,也未正确修改原列表
修正后的代码
def clean_phone_number(phone_list): cleaned_numbers = [] for num in phone_list: # 过滤所有非数字字符,只保留数字 pure_digits = ''.join([char for char in num if char.isdigit()]) # 处理前缀,确保最终以62开头 if pure_digits.startswith('62'): processed = pure_digits elif pure_digits.startswith('0'): # 去掉开头的0,再添加62前缀 processed = '62' + pure_digits[1:] else: # 直接添加62前缀 processed = '62' + pure_digits # 校验合规性:总长度13位(62+11位数字)且以62开头 if len(processed) == 13 and processed.startswith('62'): cleaned_numbers.append(int(processed)) else: cleaned_numbers.append('Invalid Number') return cleaned_numbers # 执行测试 phone = [ '82123321123', '082321123321', '+6282-456-654-456', '+62 82 789 987 789', '14045', '82145-451-145' ] print(clean_phone_number(phone))
代码说明
- 清洗数字:遍历每个号码,过滤掉所有非数字字符(如
+、-、空格),得到纯数字串 - 前缀处理:根据纯数字串的开头情况调整前缀,确保最终以
62开头 - 合规校验:检查处理后的号码长度是否为13位(
62+11位数字),符合则转为整数加入结果,否则加入'Invalid Number' - 返回结果:函数返回处理后的列表,避免修改原输入列表,符合函数设计的低耦合原则
运行上述代码后,输出结果与预期完全一致。
内容的提问来源于stack exchange,提问作者Desisy
相关产品推荐
相关产品推荐

