跳至正文

8.4数据准备类函数(下):“正则表达式”

《数据可视化分析2.0》第8章

喜乐君

在字符串函数中,有一类语法较为复杂、功能较为独特的函数:“正则函数”。它是高级分析师的神秘武器之一,初学者可以快速浏览、简要了解它的功能,后期需要时重新查阅。

正则表达式(Regular Expressions,RegEx)也称“正则函数”,用于“不规则但又有规律特征”的字符串处理。使用正则表达式的关键是从极度混乱的字符串中识别“规律”或曰“模式”(Pattern)。

本小节介绍Tableau正则表达式的主要用法,更多专业知识可以查询ICU国际文档[1]

1.正则函数中的通配符规则与表达式

Tableau正则表达式语法符合国际ICU的通用规则。理解的关键是小括号、方括号、大括号的符号代表的逻辑规则,笔者用一个例子说明。

( [A-Z]{1,2}+[0-9]{3,4} )
  • []方括号:代表某个范围中的任意字符,比如[abc]代表abc中的任意1个字母,[A-Z]代表任意大写字母,[0-9]代表任意1个数字等;
  • { }大括号:正则匹配的字符数量,紧挨在方括号之后,比如{3}代表3个字符,{3,4}代表3个或者4个字符,而{1,}代表至少1个字符;
  • ​()小括号:在提取时,代表想要返回的字符模式范围。

上面所要代表的“模式”就是1位或2位大写字母及3位或4位数字构成的字符串,比如AU2004、C340,分别代表黄金的某个期货代码、看涨估价。

基于上述规则,Tableau提供了多个正则表达式,如下所示。

  • REGEXP_EXTRACT(string, pattern):提取正则函数
    从字符串中提取符合某些字符模式的字符。
  • REGEXP_EXTRACT_NTH(string, pattern, n):提取正则函数
    多次符合条件,符合第n个。
  • REGEXP_REPLACE(string, pattern, substring):替换正则函数
    在string中,把符合pattern的字符串更换为substring。
  • REGEXP_MATCH(string, pattern):匹配正则函数
    如果字符串string中有符合pattern特征的字符串,那么返回True,否则返回False。

2.REGEXP_EXTRACT案例:提取期货品种和行权价

REGEXP_EXTRACT是最常用的正则函数,可从混乱而有序的数据中提取符合规律的字符串。

比如包含期权合约代码的一组字符串(如“AU2004C340.SHF”,代表“上海交易所发行的黄金期货AU2004期,价格看涨340元),由四个部分组成:

  • 品种: 1位或者2位字母
  • 合约:3位或者4位数字
  • 涨跌及行权价格:C或者P开始,数字2位~4位,以分隔符(.)结尾。
  • 交易所:分隔符(.)之后的字母,2位至4位。

由于品种代码数量不确定,因此不能使用字符串函数LEFT、RIGHT或MID指定位数拆分。使用正则匹配从完整的字符串中提取品种和合约部分,如图8-29所示。

图8-29  从字符串中提取符合规律的前面两个部分

在这个表达式中,核心部分是代表模式的“([A-Z]{1,2}+[0-9]{3,4})”。[A-Z]代表所有大写字母,{1,2}大括号中的数字代表匹配的位数——因为品种字母可以是1位(M),也可以是2位(CU)。

REGEXP_EXTRACT函数默认返回符合条件的第1组字符串,如果要返回符合匹配模式的第2组,可以用第二个表达式REGEXP_EXTRACT_NTH。比如从“AU2004C340.SHF”中提取涨跌及行权价(C340)。如下所示:

REGEXP_EXTRACT_NTH([ts_code], " ([A-Z]{1,2}+[0-9]{3,4})", 2)

当然,也可以在之前模式的基础上修改代表规律的模式,第二组符合条件的字符串可以加一个特征:跟紧在数字0~9之后,因此表达式如图8-30所示。

图8-30  正则表达式,返回模式的指定部分

这里的字母只有C或者P两个可能,因此也可以把([A-Z]{1,2} 改为(C |P),代表C或者P二选一。要特别注意用于提取的括号的位置。

REGEXP_EXTRACT([ts_code], " [0-9]+((C|P)+[0-9]{3,4}) " )

3.REGEXP_EXTRACT案例:从前导0字符串中提取数字

笔者在客户服务时,也曾用正则函数解决SAP HANA数据库“前导0”问题,比如数字6763在系统中被标记为00007673,45678标记为00045678,统一都是8位。用正则匹配则可以删除前导0部分,提取之后转化为数字。

有前导0的字符串,一定多个0开头,之后1~9的任意数字开始。这里[0]{1,}就代表前导0的字符串,{1,}代表至少1位数字,而[1-9]+[0-9]{0,}代表空或者任意长度。如图8-31所示。

图8-31  使用正则表达式提取前导0之后的部分

可见,使用正则表达式的关键是用字符概括模式规律。其他几个函数的方法与此一致。在复杂的大数据处理时,正则表达式是高级分析师的必备工具之一。当然,相比Python等工具,Tableau在这个方面并非能力突出,因此特别复杂问题的数据处理推荐使用Python或其他专业工具完成。


[1]  搜索引擎搜索“ICU-RegExp”,可以查到就ICU官网相关于正则表达式的使用说明书。


了解 喜乐君 的更多信息

订阅后即可通过电子邮件收到最新文章。

《8.4数据准备类函数(下):“正则表达式”》有1个想法

  1. Pingback: 8.3 数据准备类函数(上):字符串函数、日期函数 – 喜乐君

评论已关闭。

了解 喜乐君 的更多信息

立即订阅以继续阅读并访问完整档案。

Continue reading