SASにおけるPerl正規表現の存在を紹介するだけ

さんざん、マニアックなところを紹介しているのに、PRX系関数に一切触れないのはどうしてですか?というご質問をいただきました。

正直、痛いところを突かれたと思いました。
軽んじているわけではなく、まだ練習中で、あまり詳しくないからです。

ただ、PRX?という方もいらっしゃると思うので簡単な例だけ紹介します。

詳しくは「SAS Perl Regular Expressions」や「SAS 正規表現」で検索していただければ
よっぽど丁寧で詳細な資料がたくさん見つかるので、そちらで勉強してください。

正規表現は、乱暴にざっくりいうと文字のパターンマッチングのことです。
特にPerlというプログラミング言語に実装されている正規表現の書き方が、イケてる?ので
それに準じた機能をSASの関数にしましたよというのが、PRX関数です。


以前「whereステートメントでのみ使用できる演算子_contains,between,like」
http://sas-tumesas.blogspot.jp/search/label/like

でlike演算子を紹介しました。「 where X like '_B_D%' ;」のようにアンダースコアや%を使って、
文字のパターンを表現して、それにマッチしたものを抽出するといった機能でした。
感じとしては、これのゴージャス版です。

data Q1;
length X $20.;
X='123-xx';output;
X='12-xx';output;
X='423-XZ';output;
X='423_XZ';output;
X='000000 123-yy';output;
X='123-xy 123-xy 123-xy';output;
run;


ここでXの値に 数字3個の次にハイフンがきてその後 x か z か yの文字が2個続く
という特定のパターンが出現するかどうかを調べなければならないとします。

以下のコードと実行結果を見てください

data A1;
 set Q1;
  Y=PRXMATCH('/¥d{3}-[x-z]{2}/',X);
run;

まずPRXMATCH関数は、正規表現で指定したパターンが、対象変数のどの位置で
最初に出現するかを数字で返す関数です。0であれば、対象変数に指定したパターンは出現していないということです。

/¥d{3}-[x-z]{2}/ が正規表現の部分です。なんとなくわかるかもしれませんが¥d{3}が数字3個
-はそのままハイフン、[x-z]{2}がxかyかzが2個という部分に対応しています。

今は結果はYという変数に割り当てましたが、要はこれをIFステートメントに指定すれば
パターンでオブザベーションの抽出ができるわけです。

他にたくさん記号や書き方があるので、そこを勉強すれば、相当柔軟なマッチングができるわけです。

ちなみに

data A2;
 set Q1;
  Y=PRXMATCH('/¥d{3}-[x-z]{2}/i',X);
run;

とすると、大文字小文字の違いが不問化され

となります。


ちなみにただ、一致した位置を返すだけがSAS Perl正規表現ではありません。

以下のプログラムと結果をみてください

data A3;
set Q1;
 Y1=PRXCHANGE('s/23-/いろ/',1,X);
 Y2=PRXCHANGE('s/23-/いろ/',2,X);
 Y_1=PRXCHANGE('s/23-/いろ/',-1,X);
run;



これは変数の中に出現する、「23-」というパターンを「いろ」という文字列に置き換える処理です。
置換にはPRXCHANGE関数と正規表現の部分の/前にsをつけます。

第2引数は、見つかったパターンの何個目まで置換対象にするかという数字です。

ここを-1にすると、1個だろうが100個だろうが、全部置き換えるという処理になります。


多分、ここまでで、なんかこれって、もっと凄い柔軟で複雑なテキスト処理ができるんじゃないか?
と感じていただければ幸いです。
正規表現を極めれば、対テキストデータのプロになれます。
多分テキストマイニング等をされる方は、使う方多いんではないでしょうか?

/*追記*/
コメントにて、とても大切なテクニックについてご教示いただきました。有難うございます!













2 件のコメント:

  1. PRXCHANGEなどの正規表現関数の引数の変数は、TRIM等を使用して余計な空白を削除することにより、パフォーマンスの向上が期待できます。
    ご参考まで。

    返信削除
    返信
    1. コメント有難うございます!!勉強になります!
      なるほど!余計な空白入っていると、そこも検索かけちゃったりしてる感じなんでしょうね、確かにありそうです!
      もう少し勉強したら、教えていただいた点も含めてまた正規表現について投稿したいと思います。
      本当に有難うございます。また何かありましたら、コメントでも直接メールでも結構ですのでご連絡いただけると幸いです。
      sasyupi@gmail.com

      削除