本文提供一个健壮的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开头),补6
2 → 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]✅ 关键设计说明:
⚠️ 注意事项:
此方案已在给定测试用例中100%通过,可直接集成至数据预处理流水线。