これは、特定の例で機能します。
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 を含めて、最後の一致で 65932 ではなく 33186 と一致するようにする必要があります。このルールは、他のさまざまな可能性に応じて、より良い場合もあれば悪い場合もあります。データによっては、100% をキャッチするのに十分な一致がない可能性があります。両方の方法を実行し、一致しないレコードを調べることを検討してください。