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

SAS中从杂乱字符串识别提取SSN号码的实现方法咨询

SAS提取杂乱文本中SSN的最优实现方案

直接用SAS内置的正则匹配函数(PRX系列)实现,不需要针对各类前缀/后缀格式做定向适配,可自动覆盖所有符合规则的SSN场景,逻辑更简洁、召回率更高。

核心实现逻辑

我们需要匹配两类合法SSN格式,且避免从更长的连续数字中误截取9位片段:

  • 带短横线分隔的标准格式:xxx-xx-xxxx
  • 无分隔符的9位纯数字格式:xxxxxxxxx
    用正则规则(?<!\d)(\d{3}-?\d{2}-?\d{4})(?!\d)即可覆盖:
  • (?<!\d):前向断言,匹配位置前不能是数字,避免长数字截位
  • \d{3}-?\d{2}-?\d{4}:匹配3位数字+可选短横线+2位数字+可选短横线+4位数字,同时兼容两类格式
  • (?!\d):后向断言,匹配位置后不能是数字,避免长数字截位

完整SAS代码

data 输出数据集名;
    set 第二个杂乱SSN的数据集名;
    retain regex_id; /* 正则ID仅编译1次,提升性能 */
    if _n_ = 1 then do;
        regex_id = prxparse('/(?<!\d)(\d{3}-?\d{2}-?\d{4})(?!\d)/');
    end;

    length standard_ssn $11; /* 标准格式SSN长度为11 */
    standard_ssn = '';

    if prxmatch(regex_id, SSN) then do;
        /* 提取匹配到的SSN原始串 */
        raw_ssn = prxposn(regex_id, 1, SSN);
        /* 去掉短横线得到9位纯数字,再重新格式化为标准xxx-xx-xxxx格式 */
        pure_num = compress(raw_ssn, '-');
        standard_ssn = catx('-', substr(pure_num,1,3), substr(pure_num,4,2), substr(pure_num,6,4));
    end;

    drop regex_id raw_ssn pure_num; /* 丢弃中间变量 */
run;

适配说明

  • 你给出的所有示例均可正确识别:带各类前缀(TN#、PT #、数字前缀、斜杠前缀等)的SSN、带后缀的SSN都会被准确提取,无有效9位SSN的样本会返回空值
  • 如果单条记录存在多个合法SSN(比如示例里的123-45-6789/123-45-6788),上述代码默认提取第一个,如需提取所有可新增循环调用prxnext函数即可
  • 最终输出的standard_ssn和第一个数据集的SSN格式完全一致,可直接用于两表关联

内容的提问来源于stack exchange,提问作者Amanda Staudt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:09:04