re.sub怎么把匹配的内容逐一替换

s=re.sub(r'(?<=^\d{6})\d+(?=\d{4}$)', '*', '123456999999991234')
print(s)

想把里面的9全部替换为*,也就是去敏
但是这样写之后,全部9会被替换为1个*号,像这样123456*1234
怎么改才可以变成这样123456********1234

阅读 5.3k
3 个回答
# 固定值替换用replace,固定位置用切片,复杂情况正则替换为等长的*号
re.sub(r'(?<=^\d{6})\d+(?=\d{4}$)', lambda i:'*'*len(i.group()), '123456999999991234')

按照我的理解,你的需求是如果有一串字符全由数字构成并且长度大于10位,则将除了前6位和后4位外的其他数字全部替换成*号
可以这样实现:

s = '123456999999991234'
if re.match(r'\d{11,}', s):
    s = s[:6] + '*'*len(s[6:-4]) + s[-4:]
print(s)

如果你想脱敏的部分和顺序无关的话,可以试下这种方法:

import string
raw = '123456999999991234'
print raw.translate(string.maketrans('9', '*'))  # 支持多种字符替换

输出:

123456********1234
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题