如何清洗印尼手机号:从原始列表提取标准化11位号码并自动补全国家代码

如何清洗印尼手机号:从原始列表提取标准化11位号码并自动补全国家代码

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

关键说明

Krea AI

Krea AI

多功能的一站式AI图像生成和编辑平台

下载

  • 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’;
  • 生产环境建议增加日志记录无效号码原始值,便于排查数据质量问题。

https://www.php.cn/faq/2023690.html

发表回复

Your email address will not be published. Required fields are marked *