You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用正则表达式在bash/perl/python脚本中实现SSN掩码脱敏

SSN掩码脚本实现方案

核心规则说明:

  • 严格匹配两类合法SSN格式:9位无分隔符纯数字、3位数字-2位数字-4位数字横杠分隔格式
  • 排除前后带额外数字的10位及以上非法数字串
  • 两类格式分别对应掩码规则:无分隔符格式替换前5位为XXXXX,横杠分隔格式替换前两段为XXX-XX

方案1:Perl一行命令(兼容性最优,正则写法最简洁)

直接在终端执行即可,适配绝大多数Unix/Linux/macOS环境:

perl -pe 's/\b(\d{3})-(\d{2})-(\d{4})\b/XXX-XX-$3/g; s/\b(\d{5})(\d{4})\b/XXXXX$2/g' testfile

方案2:GNU sed 一行命令(适用于常规Linux发行版)

需要加-E参数开启扩展正则支持,省略大量转义符:

sed -E 's/\b[0-9]{3}-[0-9]{2}-([0-9]{4})\b/XXX-XX-\1/g; s/\b[0-9]{5}([0-9]{4})\b/XXXXX\1/g' testfile

方案3:Python脚本(适合后续扩展复杂逻辑)

将以下内容保存为mask_ssn.py:

import re
import sys

with open(sys.argv[1], 'r', encoding='utf-8') as f:
    for line in f:
        # 优先处理带横杠的SSN格式
        line = re.sub(r'\b\d{3}-\d{2}-(\d{4})\b', r'XXX-XX-\1', line)
        # 再处理无分隔符的SSN格式
        line = re.sub(r'\b\d{5}(\d{4})\b', r'XXXXX\1', line)
        print(line, end='')

执行方式:

python3 mask_ssn.py testfile

效果验证

使用题目给出的测试用例执行后,输出结果完全符合要求:

XXXXX6789 needs to be matched.
XXX-XX-6789 does, too.
Mask this XXX-XX-6789 SSN please
Don't miss XXXXX6789 either.
XXXXX6789 should match.
XXX-XX-6789 should also match.
As should XXXXX6789
And XXX-XX-6789
But not 1234567890
1234567890 should also not match.
And 1234567890 is right out.

之前替换失败的原因
  • 原有正则将横杠设为可选匹配-{0,1},替换时无法判断捕获到的SSN是带横杠还是纯数字格式,无法对应输出两种不同的掩码结果
  • 部分版本sed默认使用基础正则模式,分组括号()、次数量词{}未加反斜杠转义时,分组捕获逻辑不生效,无法提取后四位数字完成替换

内容的提问来源于stack exchange,提问作者R. Mack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 01:27:17