2. PRXPARSE () 正则表达式的“阿赖耶识”
阿赖耶识...为宇宙万有之本,含藏万有,使之存而不失,故称藏识。又因其能含藏生长万有之种子,故亦称种子识。—...
这是【SAS正则表达式】系列的第二集,全系列请在后台回复【SASRE】获取
佛家说人有九识,除眼、耳、鼻、舌、身、意八识外,还有末那识和阿赖耶识。这阿赖耶识,储藏了一切善恶的种子,包含一切宇宙信息。阿赖耶识...为宇宙万有之本,含藏万有,使之存而不失,故称藏识。又因其能含藏生长万有之种子,故亦称种子识。
——《佛光大辞典》
【SAS Says·扩展篇】正则表达式的“阿赖耶识” | 2. PRXPARSE ()
0.前集回顾
1.初识PRXPARSE()
2.例子
数据库中有一份长长的产品名单,名单中有的是产品的名字,有的是产品的编号,产品部的妹子只想要产品的编号的那些行(下图红色字体的),以做更深一步的分析。
红色字体的编号似乎看起来没有什么容易把握的规律:占位符不一样、也不全都是数字、有的行的括号后面还有空格等等,小王利用正则表达式,一分钟不到就解决了。(01)1872-8756
Body shop P1
Book B13
(05)9212-0098
PD(05)9206-4571
Shushuophone
(12) 6753-5513
None here
PD(12)6434-4532
P&DWashing
......(未显示完)
结果为:a=PRXMATCH("/(dd) ?d{4}-d{4}/", name);
if a GT 0 then output;
这是第一集提取文本数据,分析师小王初上手!的内容。我们利用PRXMATCH函数,初步介绍了什么是正则表达式。这些看起来乱乱的字符,竟然代表了一定的文本格式,比如前面说过的
编号
讲了那么多虚的,来看一个实例:
String1=”oooooo119234oooooo”;
String2=”wewewew119234p”
String3=”rrrrrrr119234yu”;
我们要提取出119的位置,代码可能要这么写:……
假如要提取1192呢?那么正则表达式要改成”/1192/”,代码中要改3次,再变一下,提取11923呢?又要改3下,就非常麻烦,利用PRXPARSE函数,将正则表达式储存在一个pattern-id中,就可以减少这种重复,每次只需要改一次。data_null_;
String1="oooooo119234oooooo";
String2="wewewew119234p";
String3="rrrrrrr119234yu";
x1=PRXMATCH("/119/",string1);
x2=PRXMATCH("/119/",string2);
x3=PRXMATCH("/119/",string3);
fileprint;
put x1= x2= x3=;
run;
data_null_;
a=PRXPARSE("/119/");
String1="oooooo119234oooooo";
String2="wewewew119234p";
String3="rrrrrrr119234yu";
x1=PRXMATCH(a,string1);
x2=PRXMATCH(a,string2);
x3=PRXMATCH(a,string3);
fileprint;
put x1= x2= x3= ;
run;
输出的结果是一样的:
无论是要提取1192、11923还是11924,都只要改一次就好了,这个函数很简单。现在我们看一下上一集初级分析师小王的例子中,如果用PRXPARSE函数该如何写代码。
name
(01)1872-8756
Body shop P1
Book B13
(05)9212-0098
PD(05)9206-4571
Shushuo phone
(12) 6753-5513
None here
PD(12)6434-4532
P&D Washing
小王给出的代码为:
如果我们用a=PRXMATCH("/(dd) ?d{4}-d{4}/", name);
if a GT 0 then output;
“PRXPASE() → 生成包含正则表达式的pattern-id → PRXMATCH()使用pattern-id作为正则表达式参数“
这个思路写代码,就应该是:
retain语句可以让SAS保存前一次变量的值,我们在基础篇中讲过这个语句,您可以点击 【SAS Says】基础篇:5. 开发数据(一)查看。data production;
if _N_=1then pattern=PRXPARSE("/(dd) ?d{4}-d{4}/");
retain pattern;
input name $char20.;
a=PRXMATCH(pattern,name);
if a GT 0thenoutput;
datalines;
(01)1872-8756
Body shop P1
Book B13
(05)9212-0098
PD(05)9206-4571
Shushuophone
(12)6753-5513
None here
PD(12)6434-4532
P&DWashing
;
procprintnoobs;
title'Production ID';
var name;
run;
输出的结果为:和之前的结果是一样的,提取除了只包含产品编号的行。
做个小游戏,您觉得本【SAS正则表达式】系列如何?
1、不好——跳转至A
2、好——跳转至2.1
2.1 打赏吗?
打赏——跳转至B
不打赏——跳转至2.2
2.2 点击文末广告?
点击——跳转至C
不点击——跳转至A
A 有什么建议意见呢?您可以在文末评论区留言,帮我做的越来越好!
B 谢谢爷~!劳驾您在文末打赏,我会再接再厉哒!
C 谢谢小哥,谢谢美女~!广告商会给我打赏哒!
相关推荐:
【SAS基础篇】
回复【sasbase】查看
SAS IML(矩阵交互模块)
回复【sasiml】查看
关注 数说工作室
微信扫一扫关注公众号