
本文提供一个健壮的python函数,用于批量清洗手机号列表:自动移除符号与空格、补全国家代码62、验证长度,并将无效号码统一替换为"invalid number"。
在处理用户输入的手机号时,格式混乱(如含空格、短横线、+号、前导零或错误国家码)是常见问题。针对印尼手机号规范——必须以62开头,且去除62后剩余部分恰好为11位纯数字——我们需要一套确定性清洗逻辑,而非仅依赖正则匹配(如\+62[0-9]{11}仅能匹配已含+62的完整串,无法覆盖082...或82...等常见变体)。
以下是推荐实现方案,兼顾可读性、鲁棒性和完整性:
import re
def clean_phone_number(phone_list):
cleaned = []
for raw in phone_list:
# 步骤1:提取所有连续数字(移除 +, -, 空格等非数字字符)
digits = re.sub(r'\D', '', str(raw))
# 步骤2:标准化前缀
if digits.startswith('62'):
# 已有62 → 直接取全部数字
candidate = digits
elif digits.startswith('08'):
# 常见印尼本地号(08开头),补62 → 628...
candidate = '62' + digits[1:]
elif digits.startswith('8'):
# 无前导0的8开头号(如'82123...'),补62 → 6282123...
candidate = '62' + digits
else:
# 其他情况(如'14045')→ 无法合规补全,标记为无效
cleaned.append('Invalid Number')
continue
# 步骤3:验证总长度是否为13位(62 + 11位)
if len(candidate) == 13 and candidate.isdigit():
cleaned.append(int(candidate)) # 按示例输出转为整数
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/08/8)覆盖印尼号码主流格式,比单一正则更实用;
- 显式检查 len(candidate) == 13 确保“62 + 11位”结构,杜绝 62123(过短)或 62123456789012(过长)等边缘错误;
- 返回 int 类型以匹配示例输出(若需保留字符串形式,可删去 int() 转换)。
⚠️ 注意事项:
- 该函数不验证号码段有效性(如运营商号段),仅做格式合规性清洗;
- 若输入含 None 或非字符串类型,str(raw) 可防止报错,但建议上游做基础类型校验;
- 如需支持国际多国号码,应扩展前缀映射表(如 {'62': 11, '86': 11, '1': 10}),而非硬编码逻辑。
此方案已在给定测试用例中100%通过,可直接集成至数据预处理流水线。










