我正在尝试使用SSN链接两个数据集。第一个数据集是干净的,所有SSN都以这样的格式表示: xxx-xx-xxxx。在第二个数据集中,SSN是一团糟。以下是该数据集中SSN的一些示例:*1234;#111 PUC;11111/123456789;TN# 123-45-6789;#123456789;PT # 123-45-6789;DOE,JOHN #1;1111111111111;123-45-6789;11-123-45-6789;123-45-6789/123-45-6788;11111/ 123456789;11111/ 123-45-6789
我想从乱七八糟的字符串中识别/提取9位数字(xxxxxxxxx或xxx-xx-xxxx)。
我使用了几个不同的SAS函数(index、substr、compress、length)来专门针对上面显示的示例,但我想知道是否有其他策略可用,因为我担心我会遗漏一些SSN,因为我的编程只针对我看到的这些更常用的格式。例如,下面的代码不仅笨拙,而且只能识别xxx-xx-xxxx格式的SSN(在初始破折号前没有破折号):
'''
INDEX=INDEX(SSN,'-');
START=INDEX-3;
IF START <0 THEN START=.;
SSN=SUBSTR(SSN,START,11);
SSN2=COMPRESS(SSN,' */#-_','a');
CHECK=LENGTH(SSN2);
IF CHECK <9 THEN SSN2='';
'''任何建议都是非常感谢的。谢谢!
发布于 2021-08-26 16:40:53
谢谢大家的帮助!使用你的建议,这对我很有效:
'''
data NEW;
length SSN $11;
re=prxparse('/(\d{3}-\d{2}-\d{4})|(\d{9})/');
set OLD;
if prxmatch(re, ORIGINAL_SSN) then
do;
SSN=prxposn(re, 0, ORIGINAL_SSN);
output;
end;
run;
'''发布于 2021-08-26 11:02:04
正则表达式模式/\d{3}-\d{2}-\d{4}/将检测大多数SSN。现实世界的数据可能有一些奇怪的边缘情况,其中SSN查找信息不是SSN。
在许多正则表达式中,SAS可以做的事情包括:
PRXMATCH PRXCHANGE functionPRXPAREN,PRXPOSN,or PRXMATCH & SUBSTR function更复杂的正则表达式将检测可能有效的有效构造的SSN。(从未分配过的一致性编号无效。)
来自https://secure.ssa.gov/apps10/poms.nsf/lnx/0110201035
...此外,使用以下命令标识无效的SSN:
·前三位数字(以前的区号)为"000“、"666”或900系列。
·第二组两位数(以前的组号)为“00”。
·第三组四位数(以前的序列号)为“0000”。
https://ihateregex.io/expr/ssn/非常详细地描述了复杂模式的操作:
^(?!0{3})(?!6{3})[0-8]\d{2}-?(?!0{2})\d{2}-?(?!0{4})\d{4}$
注意:我在短划线后添加了元字符?,以允许不包含短划线的SSN
https://stackoverflow.com/questions/68928457
复制相似问题