写一个 Python 函数 normalize_phone(s):把任意格式的中国手机号归一化成 11 位纯数字字符串(例如 "138 0013 8000"、"138-0013-8000"、"+86 138 0013 8000" 都要变成 "13800138000")。 全网 文库 学术 图片 视频 播客 思考了3.77s 5 根据搜索结果中的实现思路,normalize_phone 的核心思路是:用正则去掉所有非数字字符,如果得到 11 位且以 1 开头,即为合法的中国手机号。实现如下: import re def normalize_phone(s): """ 把任意格式的中国手机号归一化成 11 位纯数字字符串。 例如: "138 0013 8000" -> "13800138000" "138-0013-8000" -> "13800138000" "+86 138 0013 8000" -> "13800138000" """ # 去掉所有非数字字符(包括空格、横杠、加号等) digits = re.sub(r'\D', '', s) # 中国手机号:11 位且以 1 开头 if len(digits) == 11 and digits.startswith('1'): return digits # 处理带国际区号 +86 的情况:去掉 86 后应为 11 位 if len(digits) == 13 and digits.startswith('86'): candidate = digits[2:] if len(candidate) == 11 and candidate.startswith('1'): return candidate 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("138-0013-8000")) # 13800138000 说明: re.sub(r'\D', '', s) 会删除空格、横杠、加号等所有非数字字符。 归一化得到的是去掉 +86 之后的 11 位纯数字手机号。上面的版本额外处理了 +86 国际区号的情况,若直接去掉所有非数字后会得到 13 位(86 + 11 位),此时切除前两位 86 即可得到 11 位号码。 如果不希望支持国际区号、只接受纯 11 位,可删除那一段 if len(digits) == 13 ... 的代码。 上面实现可直接复制运行,满足示例中三种输入都能归一化为 "13800138000"。 生成幻灯片 展示海报