加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

在SAS中使用正则表达式

(2010-04-05 20:46:32)
标签:

sas

it

分类: SAS

SAS中可以通过prxparseprxmatchprxchangeprxsubstrprxposn等函数(或Call routinefunctionCall routine的区别是后者可以通过参数返回值的形式产生新变量)来实现用正则表达式处理数据的要求。prxparse函数以正则式为输入生成一个SAS内部用于指代改正则式的idprxmatch函数以正则式id和需要匹配的字符串为输入来进行正则匹配,如果匹配成功,则返回1,没有匹配返回0。如果匹配成功,可以使用prxposn函数来获取需要的反向匹配结果,输入为4个参数,第一个为正则式id,第二个是反向匹配的序号,第三个和第四个是输出参数,函数执行结束他们会被赋值为反向匹配在原匹配字符串中的位置和长度;这样,利用这两个返回的值并结合substr就可以得到反向匹配字符串。下面是一个具体的例子:

 

data ntest;

   set test;

   if _N_ = 1 then do;

        pattern = “/(\d+)-(\d)/”;

        retain   pattern_id;

        pattern_id = prxparse(pattern);

                       

        if missing(pattern_id) then do;

           putlog “Error: Invalid pattern”;

           stop;

        end;

    end;

    array info(2) $100. districtcode number;

    if prxmatch(pattern_id, raw) then do;

        do i=1 to 2;

           call prxposn(pattern_id, i, pos, len);

           info(i) = substr(raw, pos, len);

        end;

    end;

    else do;

        putlog “Error: No info read in”;

    end;

run;

 

prxchange子程序(Call routine)用于实现查找替换,也就是Perls/original/new/的功能。Prxchange常用的两种形式是:

call prxchange(pattern_id, n, variable)

call prxchange(pattern_id, n, variable, newvariable)

n表示匹配和替换的次数,如果是-1就表示替换全部匹配。Variable表示需要进行匹配替换的原始字符串,如果不指定newvariable,则替换之后的新字符串将覆盖原字符串,否则存储在newvariable中。举例如下:

 

data ntest;

   set test;

   if _N_ = 1 then do;

       pattern = “s/(\d+)\+(\d+)/\1\2/”;

       retain   pattern_id;

       pattern_id = prxparse(pattern);

                       

       if missing(pattern_id) then do;

          putlog “Error: Invalid pattern”;

          stop;

       end;

   end;

   call prxchange(pattern_id, -1, raw, newraw);

run;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有