写一个 Python 函数 normalize_phone(s):把任意格式的中国手机号归一化成 11 位纯数字字符串(例如 "138 0013 8000"、"138-0013-8000"、"+86 138 0013 8000" 都要变成 "13800138000")。 全网 文库 学术 图片 视频 播客 思考了7.13s 8 针对你的需求,核心思路是用正则把非数字字符全部去掉,得到纯数字串,再截取后 11 位(或校验后直接返回)作为归一化结果。实现如下: import re def normalize_phone(s): # 去掉所有非数字字符(包括空格、横杠、加号等) digits = re.sub(r'\D', '', s) # 若有 +86 国家码,则数字会多两位,取后 11 位 if len(digits) > 11 and digits.startswith('86'): digits = digits[-11:] # 校验是否为合法的 11 位中国大陆手机号 if len(digits) == 11 and digits.startswith('1'): return digits raise ValueError(f"无效的手机号: {s}") 测试: print(normalize_phone("138 0013 8000")) # 13800138000 print(normalize_phone("138-0013-8000")) # 13800138000 print(normalize_phone("+86 138 0013 8000")) # 13800138000 print(normalize_phone("+8613800138000")) # 13800138000 print(normalize_phone("8613800138000")) # 13800138000 要点说明: 用 re.sub(r'\D', '', s) 一步清除空格、横杠、加号等所有非数字字符。 当输入带 +86 国家码时,纯数字会变成 13 位(86 + 11 位),此时取后 11 位即可还原本部号码。 最后加长度(11 位)和首位(以 1 开头)校验,不对则抛 ValueError。 这样 "138 0013 8000"、"138-0013-8000"、"+86 138 0013 8000" 都会被统一成 "13800138000"。 展开讲讲 生成幻灯片 展示海报