sas正则式之prxparen
今天还是要继续正则式的内容,这周的内容是prxparen函数,这个函数我个人觉得特别有用,是因为他和“|”结合使用可以同时容纳很多种情况的字符串。
prxparse这个函数没有什么参数,就是填入prxparse正则式的字符返回对应的是praparse的哪一部分。我现在说你肯定很懵逼,来,我们举个栗子!
re=prxparse("/(one)|(two)|(three)/")
position=prxmatch(re,string)
就是这么说prxparse("/(one)|(two)|(three)/")搜索字符函数中/(one)|(two)|(three)/
用“|”分开了三个即将要搜索的字符,即‘’one”为第一个搜索字符,一旦在字符中发现“one”了就返回1,假设第一个发现的字符串是“three”就是返回3,所以返回刚才的例子就很容易理解了。
现在用一个小例子再介绍这个函数
data paren;
if _n_=1 then pattern=prxparse("/(\d
)|(\d\d )|(\d\d\d )/");
retain pattern;
input string $char30.;
position=prxmatch(pattern,string);
if position
gt 0 then which_paren=prxparen(pattern);
datalines;
one single digit 8 here
two 888 77
12345 1234 123 12 1
;
run;
结果:
如图所示,position是函数prxmatch的返回结果,即字符的位置,which_paren是prxparen的返回结果,即对应的是字符搜索的哪一部分。if position
gt 0 then which_paren=prxparen(pattern); 这里的if是为了确认是prxmatch搜索到位置的时候才判断字符是属于pattern的哪一部分。
现在用一个实际数据处理中的例子再深化这个函数。
这是一份领导给我的数据,可以看到数据上中文字符之后还有一些乱七八糟的英文啊符号啊数字啊,当时领导的需求是,把这份数据清洗出来变成只用字符的变量以及不要用类似“黄山分行”这种字眼的存在。所以当下就写了以下这段代码解决的这个需求。来,上代码!
data ss;
set dd;
if _n_=1 then
ret=prxparse("/(\D?\银行)|(\D?\金融)|(\D?\贷款)|(\D?\融资)|(\D?\保险)|(\D?\担保)|(\D?\信用[社合联])/");
retain ret;
position=prxmatch(ret,QUERY_OPERATOR);
if position
gt 0 then which_posit=prxparen(ret);
else which_posit=0;
if which_posit
gt 0 then do;
call prxsubstr(ret,QUERY_OPERATOR,start,length);
if start
gt 0 and which_posit=1 then do;
dd=substr(QUERY_OPERATOR,1,start)||"银行";
end;
if start
gt 0 and which_posit=2 then do;
dd=substr(QUERY_OPERATOR,1,start)||"金融公司";
end;
if start
gt 0 and which_posit=3 then do;
dd=substr(QUERY_OPERATOR,1,start)||"贷款公司";
end;
if start
gt 0 and which_posit=4 then do;
dd=substr(QUERY_OPERATOR,1,start)||"融资有限公司";
end;
if start
gt 0 and which_posit=5 then do;
dd=substr(QUERY_OPERATOR,1,start)||"保险有限公司";
end;
if start
gt 0 and which_posit=6 then do;
dd=substr(QUERY_OPERATOR,1,start)||"担保公司";
end;
if start
gt 0 and which_posit=7 then do;
dd=substr(QUERY_OPERATOR,1,start)||"农村信用合作社";
end;
end;
else dd='其他';
drop start length
which_posit position ret;
run;
结果:
现在单独取一个if语句的下的执行语句介绍一下:
call prxsubstr(ret,QUERY_OPERATOR,start,length);
if start
gt 0 and which_posit=1 then do;
dd=substr(QUERY_OPERATOR,1,start)||"银行";
end;
call prxsubstr 在之前的文章中已经介绍过了,所以如果忘了,再翻一下。然后if start
gt 0 and which_posit=1 then do ;这个语句中的which_posit=1 即就是搜索到“银行”两个字就是认定这个机构就是银行卡,然后就截取“银行”前面的那一串字,然后再接上“银行”两个字。这里你会问,问什么长度为什么用的是“start”这个变量,因为我们搜索的是”银行”两个字,所以返回的位置是银行的位置,但是我们需要的是“银行”前面的那一串字符,所以就使用start作为长度。数据分析师培训
最新文章
- 雅虎(yahoo)前端优化十四条军规
- 去块率波 Deblocking filter
- [hackerrank]The Love-Letter Mystery
- [BZOJ2173]整数的lqp拆分
- 在树莓派上安装leanote
- C#多显示器转换的两种方法——SetWindowPos,Screen
- 解密电子书之二:EPD控制芯片
- 销量预测和用户行为的分析--基于ERP的交易数据
- Spring Cloud Consul 实现服务注册和发现
- Ubuntu16下Hive 安装
- 【翻译】从头开始写一个时间序列数据库-Writing a Time Series Database from Scratch
- [AHOI2008]紧急集合 / 聚会
- Date类型与字符串之间的转换
- php设计模式-工厂模式(一)
- 第一次安装tomcat报错,出现failed to install tomcat8 service错误
- mongodb更新数组中的所有匹配项
- katalon系列十五:给浏览器添加cookie自动登陆
- xdebug常用配置
- 五十三 网络编程 TCP/IP简介
- TP细节总结1