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
相关产品推荐
相关产品推荐

