Python电话号码清洗函数逻辑错误排查咨询
电话号码清洗函数的逻辑错误分析与修复
核心错误点
原代码逻辑完全违背需求规则,导致所有输入都被判定为无效,具体错误如下:
1. 判断条件完全颠倒
需求要求最终号码以62开头,且去掉62前缀后剩余11位数字(即总长度为13位),但原代码的判断条件是:
if len(cleaned_number) == 11 and cleaned_number.startswith('62'):
这意味着它要求清洗后的号码本身是11位且以62开头,之后还额外拼接62前缀,生成62+62xxxxxxxxx这种错误格式,完全不符合需求。这种判断逻辑和规则完全相反,自然所有合法输入都无法满足条件。
2. 未处理合法的前缀格式
印尼手机号常见格式有08xxxxxxxxx、+62xxxxxxxxx、8xxxxxxxxx,原代码没有针对这些前缀做转换,直接按原始清洗后的数字判断,导致这些合法号码被误判。
3. 重复添加62前缀
即使原判断条件满足,代码会把已经带62的11位数字再拼接一次62,生成错误的13位号码(如6262123456789),不符合最终格式要求。
修正后的代码
def clean_phone_number(phone_lists): phone_clean = [] for phone in phone_lists: # 移除所有非数字字符 cleaned_number = ''.join(filter(str.isdigit, phone)) # 处理不同前缀,统一转换为62开头的格式 if cleaned_number.startswith('0'): # 去掉开头的0,替换为62 processed_number = '62' + cleaned_number[1:] elif cleaned_number.startswith('62'): # 已有62前缀,直接保留 processed_number = cleaned_number else: # 无有效前缀,直接添加62 processed_number = '62' + cleaned_number # 验证:总长度必须为13位(62+11位数字),且全为数字 if len(processed_number) == 13 and processed_number.isdigit(): phone_clean.append(int(processed_number)) else: phone_clean.append('Invalid number') return phone_clean phone_lists = [ '82123321123', '082321123321', '+6282-456-654-456', '+62 82 789 987 789', '14045', '82145-451-145' ] phone_clean = clean_phone_number(phone_lists) print(phone_clean)
修正说明
- 前缀统一处理:针对输入的不同前缀(0开头、62开头、无前缀)做对应转换,确保最终号码以62开头。
- 正确的验证逻辑:检查处理后的号码长度为13位(符合62+11位数字的要求),且全为数字,满足规则。
- 避免重复前缀:根据输入前缀的实际情况处理,不会重复添加62。
运行修正后的代码,输出与预期一致:
[6282123321123, 6282321123321, 6282456654456, 6282789987789, 'Invalid number', 6282145451145]
内容的提问来源于stack exchange,提问作者helmi fitrayadi
相关产品推荐
相关产品推荐

