Python中如何删除长度为10的字符串的前导数字9
解决方案
你之前的方法不符合预期,原因是:
- 直接用
[1:]切片会无差别切掉所有字符串的第一个字符,对长度不等于10的字符串会造成内容丢失 - 直接用
str.replace()替换前导9,会误删原本就以9开头、长度不符合要求的字符串的首字符
方法1:使用正则匹配替换(推荐,pandas向量化操作性能更高)
用正则精准匹配长度为10且首字符为9的场景,仅替换这种情况的首字符:
# 处理前导9 res = add9toTell.str.replace(r'^9(?=.{9}$)', '', regex=True) # 测试输出 print(res) # 输出:5555-5555
正则说明:^9匹配开头的9,(?=.{9}$)是正向预查,确认9后面刚好有9个字符,整体总长度为10,不会误匹配其他场景。
方法2:使用apply自定义逻辑(可读性更强)
如果需要更灵活的判断逻辑,可以用apply遍历每个字符串做条件判断:
res = add9toTell.apply(lambda x: x[1:] if len(x) == 10 and x.startswith('9') else x)
多场景测试验证
你可以用下面的测试用例验证两种方法的准确性:
import pandas as pd test_series = pd.Series([ '95555-5555', # 符合条件,要删前导9 '85555-5555', # 长度10但首字符不是9,不处理 '91234', # 长度不足10,不处理 '91234567890' # 长度超过10,不处理 ]) # 用方法1处理 print(test_series.str.replace(r'^9(?=.{9}$)', '', regex=True))
输出结果:
0 5555-5555 1 85555-5555 2 91234 3 91234567890 dtype: object
内容的提问来源于stack exchange,提问作者user2916405
相关产品推荐
相关产品推荐

