正则表达式的“阿赖耶识”| 【SAS Says·扩展篇】正则表达式

阿赖耶识...为宇宙万有之本,含藏万有,使之存而不失,故称藏识。又因其能含藏生长万有之种子,故亦称种子识。 ——《佛光大辞典》

佛家说人有九识,除眼、耳、鼻、舌、身、意八识外,还有末那识和阿赖耶识。这阿赖耶识,储藏了一切善恶的种子,包含一切宇宙信息。


【SAS Says·扩展篇】正则表达式的“阿赖耶识” | 2. PRXPARSE ()

0.前集回顾

1.初识PRXPARSE()

2.例子


0. 前集回顾:

刚毕业的小王来到一家零售公司的数据部门做一名分析师,上班的第一天,产品部的妹子就找他来解决一个问题:

数据库中有一份长长的产品名单,名单中有的是产品的名字,有的是产品的编号,产品部的妹子只想要产品的编号的那些行(下图红色字体的),以做更深一步的分析。

(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("/\(\d\d\) ?\d{4}-\d{4}/", name); if a GT 0 then output;

结果为:

这是第一集提取文本数据,分析师小王初上手!的内容。我们利用PRXMATCH函数,初步介绍了什么是正则表达式。这些看起来乱乱的字符,竟然代表了一定的文本格式,比如前面说过的

P?D?\(\d\d\) ?\d{4}-\d{4}

这个简单的表达式,却可以代表复杂的意思:

编号

P

D

(

XX

)

空格

XXXX

-

XXXX

正则表达式

P?

D?

\(

\d\d

\)

空格?

\d{4}

-

\d{4}

按照这个思路,正则表达式不同的组合,可以组合出各种文本格式,但是,随着正则表达式的越来越复杂、越来越长,在代码中来回引用就会很不方便。本集要介绍的PRXPARSE函数,可以将不论多长的表达式储存起来,方便引用。

还记得第一集介绍的匹配函数PRXMATCH(),它的格式如下:

PRXMATCH ( pattern-id orregular-expression, string )

第一个参数可以是pattern-id,也可以直接是正则表达式(regular-expression)。这个pattern-id就是正则表达式的一个代号,我们可以利用PRXPARSE将正则表达式储存在这个代号中。

讲了那么多虚的,来看一个实例:

String1=”oooooo119234oooooo”; String2=”wewewew119234p” String3=”rrrrrrr119234yu”;

……

我们要提取出119的位置,代码可能要这么写:

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;

假如要提取1192呢?那么正则表达式要改成”/1192/”,代码中要改3次,再变一下,提取11923呢?又要改3下,就非常麻烦,利用PRXPARSE函数,将正则表达式储存在一个pattern-id中,就可以减少这种重复,每次只需要改一次。

1. 初识PRXPARSE()

这个函数用来获取某种正则表达式,并存在pattern-id中,方便其他函数来用,它的格式为:

PRXMATCH (regular-expression)

以上面那个为例:

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函数该如何写代码。

2. 例子

先回顾一下上一集小王遇到的问题——提取下面表中只有产品编号的(红色字体):

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("/\(\d\d\) ?\d{4}-\d{4}/", name); if a GT 0 then output;

如果我们用

“PRXPASE() → 生成包含正则表达式的pattern-id → PRXMATCH()使用pattern-id作为正则表达式参数“

这个思路写代码,就应该是:

data production; if _N_=1then pattern=PRXPARSE("/\(\d\d\) ?\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;

retain语句可以让SAS保存前一次变量的值,我们在基础篇中讲过这个语句,您可以点击 【SAS Says】基础篇:5. 开发数据(一)查看。

输出的结果为:

和之前的结果是一样的,提取除了只包含产品编号的行。


原文发布于微信公众号 - 数说工作室(shushuojun)

原文发表时间:2015-12-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏工科狗和生物喵

对菜鸟教程的Python一百例的个别改进

好吧,其实是小妹子Python公选课结课,所以我来帮忙做个大作业(简单到哭的大作业好吗?)!她的大作业就是老师把菜鸟教程的Python一百例扒下来做成文档,然后...

4076
来自专栏Jimoer

Java设计模式学习记录-建造者模式

今天周末,有小雨,正好也不用出门了,那就在家学习吧,经过了两周的面试,拿到了几个offer,但是都不是自己很想去的那种,要么就是几个人的初创小公司,要么就是开发...

1383
来自专栏杨建荣的学习笔记

对一道if-else相关的程序题的简单分析(r5笔记第45天)

今天同事在微信群里提出了一个问题,看似是一个面试题。 大体的意思就是补充下面if条件使得输出 Hello World if(){ System.out.prin...

3565
来自专栏数说工作室

2. PRXPARSE () | 正则表达式的“阿赖耶识”

阿赖耶识...为宇宙万有之本,含藏万有,使之存而不失,故称藏识。又因其能含藏生长万有之种子,故亦称种子识。 ——《佛光大辞典》 佛家说人有九识,除眼、耳、鼻、...

3566
来自专栏程序员的SOD蜜

JavaScript的“原型甘露”

今天跟朋友讨论JS的面向对象编程问题,想起了原来曾经看过一篇文章,但是看过很久想不起来了,用了很多关键词,终于用“悟透JavaScript  面向对象”这两个关...

2618
来自专栏令仔很忙

C#----委托和事件(一)

最近在做的项目,正在进行重构,之前的框架就是纯三层的简单调用,外加一些Session,SQLHelper等封装管理类,其他的东西,一直也想去抽象,但是奈何能力...

5781
来自专栏Python小屋

Python中带else子句的for循环执行过程

这几天在厦门讲课,每天6小时,没有太多时间写新代码,宾馆不知道咋想的也不提供WiFi,只好用手机做个热点临时分享一点基础知识,300M的包月流量伤不起,热点瞬间...

2764
来自专栏更流畅、简洁的软件开发方式

面向对象的本质是什么?

  什么是面向对象的本质呢?   万物皆对象?No   抽象?No   复用?No   那到底是什么呢? 万物皆对象。问了几位网友,这是答复之一。看到了某个...

3549
来自专栏landv

C语言介绍

3702
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-day08-超市购物系统总结

Java基础-day08-超市购物系统总结 超市购物小票——自定义类 1案例介绍与演示 将超市购物小票案例中零散数据(名称、货号、单价、计价单位等)封装为货物对...

4796

扫码关注云+社区

领取腾讯云代金券