这适用于您的具体示例。
data have;
length str $150;
infile datalines truncover;
input @1 str $150.;
datalines;
13001 NW42 AVE OPA LOCKA FL 33054 USA
13001 NW 42 AVENUE OPA LOCKA FL 33054 USA
PO BOX 98748 CHICAGO IL 60693 USA
601 W 80TH STREET CHICAGO IL 60620 2502
12651 S DIXIE HWY, SUITE 321 MIAMI,FLORIDA33156
12713 SW 125TH AVE MIAMIFL 331865932
;;;;
run;
data want;
set have;
z_Re = prxparse('`(\d{5}) ?(?:$|USA|\d{4})`o');
rc_z = prxmatch(z_re,trimn(str));
if rc_z then zip = prxposn(z_re,1,str);
put zip=;
run;
您可以调整它以包含其他内容,或者对可能出现 5(+) 数字字符串(邮政编码)的可能位置进行一些合理性检查。例如,您可能要求它在字符串结尾的 10 个字符内,并且至少在字符串开头的 10 个字符内:
data want;
set have;
z_Re = prxparse('`^.{10,}\D(\d{5}).{0,10}$`o');
rc_z = prxmatch(z_re,trimn(str));
if rc_z then zip = prxposn(z_re,1,str);
put zip=;
run;
我必须包含一个 \D 以确保它在最后一场比赛中匹配 33186 而不是 65932。根据您的各种其他可能性,这条规则可能更好也可能更糟;根据您的数据,可能没有匹配项足以捕获 100%。您可能会考虑同时使用这两种方法,并查看他们不同意的记录。