17370845950

如何清洗并标准化印尼手机号码(以62开头的11位有效号码)

本文提供一个健壮的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]

关键设计说明

  • 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%通过,可直接集成至数据预处理流水线。