楼主: yukiooy
12210 12

有关SAS正则表达式 [推广有奖]

  • 3关注
  • 5粉丝

院士

0%

还不是VIP/贵宾

-

威望
0
论坛币
14152 个
通用积分
73.5400
学术水平
17 点
热心指数
27 点
信用等级
9 点
经验
760 点
帖子
1394
精华
0
在线时间
1235 小时
注册时间
2008-12-22
最后登录
2023-8-11

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
这是一篇有关SAS正则表达式的文章,可以通过这篇文章来学习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);



ifmissing(pattern_id) then do;

putlog“Error: Invalid pattern”;

stop;

end;

end;

array info(2) $100. districtcodenumber;

if prxmatch(pattern_id,raw) then do;

do i=1 to 2;

callprxposn(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);



ifmissing(pattern_id) then do;

putlog“Error: Invalid pattern”;

stop;

end;

end;

callprxchange(pattern_id, -1, raw, newraw);
run;
一些实例:
基本应用
DATA _NULL_;
TITLE “Perl Regular Expression Tutorial ¨C Program 1″;
IF _N_ = 1 THEN PATTERN_NUM = PRXPARSE(”/cat/”);
/*Exact match for the letters ‘cat’ anywhere in the string*/
RETAIN PATTERN_NUM;
INPUT STRING $30.;
POSITION = PRXMATCH(PATTERN_NUM,STRING);
FILE PRINT;
PUT PATTERN_NUM= STRING= POSITION=;
DATALINES;
There is a cat in this line.
Does not match CAT
cat in the beginning
At the end, a cat
cat
;
说明:
PRXPARSE(”/cat/”);定义正则表达式。
PRXMATCH(PATTERN_NUM,STRING)用定义的正则表达式PATTERN_NUM匹配字符串STRING中的字符串,函数返回匹配字符串的出现位置。
/…/表示的是一个正则表达式的起止。
下面这两行代码的含义是只在处理第一条观测时对正则表达式进行编译,之后处理其它观测时都使用这个编译好的正则表达式。这样节省了编译时间。
IF _N_ = 1 THEN PATTERN_NUM = PRXPARSE(”/cat/”);
RETAIN PATTERN_NUM;


数据验证
下面这个例子对字符串的格式进行了验证。
data phone_numbers;
length phone $ 16;
input phone $16.;
datalines;
(919)319-1677
800-899-2164
(508)852-2146
(252)152-7583
;
run;
DATA match_phone;
SET phone_numbers;
IF _N_ = 1 THEN PATTERN = PRXPARSE(”/\(\d\d\d\) ?\d\d\d-\d{4}/”);
***Regular expression will match any phone number in the form:
(nnn)nnn-nnnn or (nnn) nnn-nnnn.;
/*
\(       matches a left parenthesis
\d\d\d   matches any three digits
(blank)? matches zero or one blank
\d\d\d   matches any three digits
-        matches a dash
\d{4}    matches any four digits
*/
RETAIN PATTERN;
IF PRXMATCH(PATTERN,PHONE) GT 0 THEN OUTPUT;
RUN;
PROC PRINT;RUN;
说明
上面的例子用于检查变量phone是否符合格式规范,先是用data步输出变量匹配的观测,接着又在sql中使用正则表达式输出变量不匹配的观测。
在使用sql时,例子没有使用PRXPARSE函数先定义正则表达式,而是直接在prxmatch函数中直接定义正则表达式。
提取匹配某模式的字符串
DATA EXTRACT;
IF _N_ = 1 THEN DO;
PATTERN = PRXPARSE(”/\(\d\d\d\) ?\d\d\d-\d{4}/”);
IF MISSING(PATTERN) THEN DO;
PUT “ERROR IN COMPILING REGULAR EXPRESSION”;
STOP;
END;
END;
RETAIN PATTERN;
LENGTH NUMBER $ 15;
INPUT STRING $CHAR80.;
CALL PRXSUBSTR(PATTERN,STRING,START,LENGTH);
IF START GT 0 THEN DO;
NUMBER = SUBSTR (STRING,START,LENGTH);
NUMBER = COMPRESS(NUMBER,” “);
OUTPUT;
END;
KEEP NUMBER;
DATALINES;
THIS LINE DOES NOT HAVE ANY PHONE NUMBERS ON IT
THIS LINE DOES: (123)345-4567 LA DI LA DI LA
ALSO VALID (123) 999-9999
TWO NUMBERS HERE (333)444-5555 AND (800)123-4567
;
PROC PRINT DATA=EXTRACT NOOBS;
TITLE “Extracted Phone Numbers”;
RUN;
说明
这段代码使用了PRXSUBSTR函数,返回了匹配字符串在目标字符串中的开始位置和长度,然后使用SUBSTR函数截取匹配的字符串并用COMPRESS去掉空格。
查找和替换
DATA CAT_AND_MOUSE;
INPUT TEXT $CHAR40.;
LENGTH NEW_TEXT $ 80;
IF _N_ = 1 THEN MATCH = PRXPARSE(”s/[Cc]at/Mouse/”);
*Replace “Cat” or “cat” with Mouse;
RETAIN MATCH;
CALL PRXCHANGE(MATCH,-1,TEXT,NEW_TEXT);
IF TRUNC THEN PUT “Note: NEW_TEXT was truncated”;
DATALINES;
The Cat in the hat
There are two cat cats in this line
;
PROC PRINT DATA=CAT_AND_MOUSE NOOBS;
TITLE “Listing of CAT_AND_MOUSE”;
RUN;
说明
这段代码使用了prxchange将变量中的“cat”或“Cat”替换成了“Mouse”
Prxchange的使用方法和参数说明如下:
CALL PRXCHANGE(pattern-id or regular-expression, times, old-string <, new-
string <, result-length <, truncation-value <, number-of-changes>>>>);
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:正则表达式 表达式 Expression PrxChange truncated function 表达式 字符串 文章

043-29.pdf

43.1 KB

速查表.pdf

161.71 KB

265-29.pdf

477.63 KB

已有 4 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
intheangel + 60 + 60 + 1 + 1 + 1 精彩帖子
klaudlit + 1 精彩帖子
a6566792 + 1 + 1 精彩帖子
爱萌 + 40 + 100 + 1 非常好,特此奖励一些,以表心意

总评分: 经验 + 100  论坛币 + 160  学术水平 + 3  热心指数 + 3  信用等级 + 1   查看全部评分

本帖被以下文库推荐

沙发
chinalin2002 发表于 2009-12-6 11:40:40 |只看作者 |坛友微信交流群
什么叫SAS正则函数啊
仁者不忧,知者不或,勇者不畏。

使用道具

藤椅
爱萌 发表于 2009-12-6 12:50:57 |只看作者 |坛友微信交流群
强烈推荐大家看看第一篇文章,也谢谢楼主
最恨对我说谎或欺骗我的人

使用道具

板凳
曹建宇 发表于 2009-12-6 13:48:12 |只看作者 |坛友微信交流群
主要是一些语句的表达吧!

使用道具

报纸
kutuomonk 发表于 2010-12-20 15:32:19 |只看作者 |坛友微信交流群
久旱逢甘雨啊,谢谢楼主,困惑了很久。

使用道具

地板
yongjiang2 发表于 2012-4-21 10:17:30 |只看作者 |坛友微信交流群
谢谢。。。。。。。。。。

使用道具

7
永远的蝴蝶 发表于 2012-8-26 10:20:21 |只看作者 |坛友微信交流群
Great!

使用道具

8
anxiangzheng 发表于 2012-10-5 20:49:29 |只看作者 |坛友微信交流群
太感谢了

使用道具

9
老师她摸我 发表于 2012-10-17 17:09:06 |只看作者 |坛友微信交流群
灰常感谢
欢迎加入SAS群:144839730-蜗牛

使用道具

10
evanwang1990 发表于 2012-10-23 14:23:45 |只看作者 |坛友微信交流群
学习一下

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-3 03:49