Excel 手机号列批量清洗:去空格去横杠、去 +86、格式校验、去重

2026-10-06 · 喵窝资源铺

做短信群发、客户回访,手机号列几乎从来没有干净过:" 13812345678 " 前后带空格、138-1234-5678 带横杠、+86 13812345678 带国际区号、少一位/多一位的、空值,还有同一个人用不同写法出现两次。直接拿去群发,格式错的报错中断,重复的发两遍。这篇给一个 30 行脚本一遍过:归一化 → 正则校验 → 按号码去重,脏行带行号和原因挑进报告,绝不混进结果。代码实跑验证,真实输出贴在下面。

输出长什么样

构造一份 8 行的客户名单:正常带空格、带横杠、首位是 2、只有 10 位、+86 区号(归一后与第一条同号)、纯重复、12 位、空值。跑完:

清洗完成:有效 1 条,剔除 7 条
  - 第3行 李四: 与第2行(张三)重复
  - 第4行 王五: 手机号「23812345678」格式非法
  - 第5行 赵六: 手机号「1381234567」格式非法
  - 第6行 钱七: 与第2行(张三)重复
  - 第7行 孙八: 与第2行(张三)重复
  - 第8行 周九: 手机号「138123456799」格式非法
  - 第9行 吴十: 手机号为空

姓名,手机号
张三,13812345678

逐条核对:李四的 138-1234-5678 去横杠后与张三同号,去重正确;钱七的 +86 13812345678 去区号去空格后同号,去重正确;首位非 1、10 位、12 位、空值 4 条全部带行号和原因挑出。8 行测试数据 8 条判定全对。

完整脚本

# -*- coding: utf-8 -*-
"""清洗手机号列:归一化(去+86/横杠/空格)→ 正则校验 → 按号码去重,脏行挑进报告。"""
import sys, csv, re

src, dst = sys.argv[1], sys.argv[2]
PHONE = re.compile(r'^1[3-9]\d{9}$')

def norm(s):
    # 顺序有讲究:先去+86再去空格。若先去空格,"+86 138..."会变成"+86138...",replace('+86')仍能命中,
    # 但"+ 86"这种中间带空格的就会漏掉——先去区号再统一去空格最稳。
    return (s or '').replace('+86', '').replace('-', '').replace(' ', '').strip()

rows, bad = [], []
with open(src, encoding='utf-8-sig', newline='') as f:
    reader = csv.reader(f)
    header = next(reader)
    for i, parts in enumerate(reader, start=2):
        name = parts[0] if parts else ''
        raw = parts[1] if len(parts) > 1 else ''
        p = norm(raw)
        if not p:
            bad.append((i, name, '手机号为空')); continue
        if not PHONE.match(p):
            bad.append((i, name, f'手机号「{raw.strip()}」格式非法')); continue
        dup = next((j for j, r in enumerate(rows) if r[1] == p), None)
        if dup is not None:
            bad.append((i, name, f'与第{dup+2}行({rows[dup][0]})重复')); continue
        rows.append((name, p))

with open(dst, 'w', encoding='utf-8', newline='') as f:
    w = csv.writer(f)
    w.writerow(['姓名', '手机号'])
    w.writerows(rows)

print(f'清洗完成:有效 {len(rows)} 条,剔除 {len(bad)} 条')
for i, name, why in bad:
    print(f'  - 第{i}行 {name}: {why}')

实跑里揪出来的两个真坑

扩展:要区分运营商怎么办

按 2019 年后携号转网普及的现状,靠号段判断运营商已不可靠(138 的人可能携转到电信)。如果只是要给发短信通道分类,直接让短信网关自动路由即可,别在本地按号段猜。

不想自己跑?把活儿给我。名单里手机号、邮箱、身份证号、日期混着脏数据,我可以替你写好脚本、用你的真实文件实测后交付(¥19.9 表格处理 / ¥29.9 脚本定制)。
→ 去下单页看看 | 虚拟物品交付后不退款;未收到或未达承诺免费补发/重做。

相关文章:邮箱列清洗去重 · 身份证号批量提取去重 · 表格按部门拆分

← 更多实跑干货 | 喵窝资源铺