
本文提供一个健壮的python函数,用于批量清洗印尼手机号:移除所有非数字字符、校验是否以62开头且总长为13位(含62)、对缺失前缀的号码自动补全,并将不满足条件的条目统一标记为"invalid number"。
要正确清洗印尼手机号,关键在于三步处理:标准化(去除非数字字符)→ 前缀归一化(补全或校验62)→ 长度验证(必须为13位纯数字,即62 + 11位)。原始代码存在多个问题:未真正执行字符清理(translate未生效且语法错误)、未做有效性判断、直接修改原列表且无返回值。
以下是完整、可直接运行的解决方案:
import re
def clean_phone_number(phone_list):
"""
清洗印尼手机号列表,返回标准化后的结果列表。
规则:
- 仅保留数字字符
- 若以'62'开头且总长为13位 → 保留
- 若以'08'开头(印尼常见移动号段,隐含62)→ 替换为'628'
- 若以'8'开头(如'821...')→ 补前缀'62'
- 其他情况(长度≠13、含非法前缀等)→ 返回'Invalid Number'
"""
cleaned = []
for raw in phone_list:
# Step 1: 提取所有数字
digits = re.sub(r'\D', '', str(raw))
# Step 2: 前缀标准化与长度校验
if digits.startswith('62'):
if len(digits) == 13:
cleaned.append(int(digits)) # 符合要求:62 + 11位
else:
cleaned.append('Invalid Number')
elif digits.startswith('08') and len(digits) == 12:
# '08...' → 转为 '628...'(印尼08x等同于628x)
cleaned.append(int('62' + digits[1:]))
elif digits.startswith('8') and len(digits) == 11:
# 纯11位以8开头 → 补62(如'821...' → '62821...')
cleaned.append(int('62' + digits))
else:
cleaned.append('Invalid Number')
return cleaned
# 测试数据
phone = [
'82123321123',
'082321123321',
'+6282-456-654-456',
'+62 82 789 987 789',
'14045',
'82145-451-145'
]
result = clean_phone_number(phone)
print(result)
# 输出:[6282123321123, 6282321123321, 6282456654456, 6282789987789, 'Invalid Number', 6282145451145]✅ 关键说明:
- re.sub(r'\D', '', ...) 是最可靠的方式清除所有非数字字符(空格、+、-、括号等),比手动替换符号更鲁棒;
- 不依赖正则匹配 \+62[0-9]{11}(该模式仅能匹配带+的原始格式,无法处理082...或纯821...等常见变体);
- 明确区分三种合法前缀场景:62xxx(直接校验)、08xxx(印尼本地号去0加62)、8xxx(补62),覆盖题目全部用例;
- 返回 int 类型确保输出与示例一致(如 6282123321123 而非字符串),同时保持 'Invalid Number' 为字符串类型,符合混合类型需求。
⚠️ 注意事项:
- 输入应为字符串或可转为字符串的类型(如数字ID),函数内部已做 str() 容错;
- 若需严格遵循“必须以62开头且后续11位”的定义(即禁止08转换),可简化逻辑为:仅接受 62 开头且 len==13,其余全为 'Invalid Number';
- 生产环境建议增加日志记录无效号码原始值,便于排查数据质量问题。










