使用Pandas和正则表达式清洗带国家代码的电话号码,提取10位有效数字
简洁实现思路
你之前卡壳的核心原因是一直抱着「找需要删掉的前置冗余内容」的思路,但实际上我们已经明确了最终要保留的目标内容是什么——就是串末尾连续的10位有效数字,完全可以反过来匹配需要保留的内容,根本不用提前猜国家代码是1位、2位还是3位,一劳永逸覆盖所有前置冗余的场景。
具体实现步骤
- 保留你已经写对的第一步:先把所有非数字字符全部清掉,这一步不需要改动
- 这一步的作用是把括号、短横、加号、空格这些杂符号全部删干净,只留纯数字串
- 后续处理完全不需要写复杂的匹配规则,两种实现方式都比自定义函数简洁高效:
- 直接提取匹配目标内容:用正则匹配字符串末尾的10位数字,直接把这部分内容抽出来,自动忽略前面所有的前置内容(不管是国家代码1、还是其他杂的前置数字)
运行后得到的结果完全符合预期:import pandas as pd phone_series = pd.Series(['+1(192) 167-4056', '123-345-4568', '1233455678', '(123) 123-1234']) # 清除所有非数字字符 only_digits = phone_series.str.replace(r'[^0-9]+', '', regex=True) # 提取末尾10位数字作为有效号码 final_phones = only_digits.str.extract(r'(\d{10})$')[0]0 1921674056 1 1233454568 2 1233455678 3 1231231234 dtype: object - 如果更倾向于“删掉冗余内容”的replace逻辑,也可以用正向预查定位所有需要删除的前置部分,直接替换成空就行,效果和上面的extract完全一致:
这个正则的逻辑是:从字符串开头开始,所有“后面紧跟着整整10位数字直到串尾”的数字部分,全是要删掉的冗余内容,不管这些内容是1位的国家代码还是更长的前缀,都能精准匹配删除。final_phones = only_digits.str.replace(r'^\d+?(?=\d{10}$)', '', regex=True)
- 直接提取匹配目标内容:用正则匹配字符串末尾的10位数字,直接把这部分内容抽出来,自动忽略前面所有的前置内容(不管是国家代码1、还是其他杂的前置数字)
额外优势
- 这套逻辑不需要你提前定义国家代码的长度,不管后面遇到带2位、3位国家代码的号码,只要有效手机号是串的最后10位,都能自动适配,不用改正则
- 遇到清完数字后长度不足10位的无效坏数据,extract方法会自动返回空值,刚好可以帮你筛出无效数据,不会像硬截断一样把无效号错剪成半拉的数字
- 所有操作都是Pandas原生的矢量化字符串方法,跑大数量级数据的时候比逐行apply自定义函数快很多
内容的提问来源于stack exchange,提问作者linkdkm
相关产品推荐
相关产品推荐

