在Alteryx中使用Regex Expression 正则表达式
发布网友
发布时间:2022-09-06 05:22
我来回答
共1个回答
热心网友
时间:2024-11-24 17:20
文:Lucia
参考文献链接:
https://community.alteryx.com/t5/Alteryx-Knowledge-Base/Tool-Mastery-RegEx/ta-p/37689
【作者注:由于正则表达翻译的晦涩,这篇并不是完全逐字编译的文章,相当于结合原文案例和已有正则学习材料的基于自己表达的解说,特此说明】
——在Alteryx中使用Regex Expression 正则表达式
首先如果您不太了解正则表达式是什么的话,可以点击下面的30分钟快速入门正则表达式教程
▼ ▼
https://www.runoob.com/w3cnote/regular-expression-30-minutes-tutorial.html
▲ ▲
简而言之,正则表达式已经是独立的一门语言,早已嵌入很多的分析工具中,Alteryx也不例外,这种常用于文本挖掘的抽象语言,不必死记硬背,就好比工具箱里的各种螺丝——用得上能解决需求就是了。
Let‘s Start——>
Alteryx用户可以在[Parse] 找到Regex
对这个图标我们可以右键打开官方内置Example 【RegEx.yxmd】
下面是对Example里的设置进行的解读
1)Regex Match乃根据正则表达式指定的匹配规则返回是否匹配成功,即返回(True/False)
下图是在Address列中根据 *.-\d{4} 即指定匹配任意字符+”-“+任意四位数字规则的正则设置
2)Regex Parse乃根据正则表达式指定的匹配规则截取字段成为新列
下图是在Name列中根据([a-z]+)\s([a-z]+) 即指定匹配任意字母+空格+任意字母的正则表达,截取第一段为First Name ,截取第二段为Last Name
3)Regex Replace乃根据正则表达式指定的匹配规则把匹配的字符组按照自定义替换的规则进行替换
下图里是对Address栏里按照(.*), (.*), (.*)\s(\d{5})(-\d{4})?的规则(此处5个括号5个组)以$4:$2,$3为替换语言 去实现以第4组字符:第2组字符,第3组字符为内容的替换
4)Regex Tokenize是根据正则表达式指定的匹配规则当作分隔关键字进行分栏/分列
下图里是对Address栏里按照[^,]+ 的规则,即配不含”,”的任意字符各自成组(SET)切成3列
Alteryx本身也会有一些提示语法藏在点击Regular
Expression旁的倒三角里
此外Alteryx 的Formula中也有正则应用函数
REGEX_CountMatches(string,pattern,icase)
REGEX_Match(string,pattern,icase)
REGEX_Replace(string,pattern, replace,icase)
看了官方内置案例后我们还是回到Alteryx Community 的Tool Mastery系列看看那边的大侠怎么解说alteryx里的正则表达式吧
先上吐槽漫画,论写正则的*格
论写正则的过程
你可以视正则为另一门语言,它用符号的形式去匹配文本中一串字母字符数字,是一个对象型语言。
下面举个栗子
3345
Michelson Drive, Suite 400, Irvine, CA 92612
12303
Airport Way, Suite 250, Broomfield, CO 80021
Two
North Riverside Plaza, Suite 1430, Chicago, IL 60606
在这个国外的地址模式里,哪一块是街道门牌哪一块城市哪一块是邮编老外一眼便知,但是对于计算机来说这些都是一大段文字,中间有些空格或者分隔符,它不会在乎这段文字是不是具备地址的特征。而正则表达式是一种方式去让计算机和我们去识别这些有用信息,下面我们把这段文字翻译成正则表达吧!
3345 ^ \d+ ^ 是正则里一行的开头,而 \d 代表任意数字(0-9) + 代表重复匹配1次以上,像是开头是数字的地址靠 ^ \d+ 就能匹配任意位数数字了 ,
Michelson Drive [^ \d]+ 非数字的匹配也就是数字的反义则是加 [^ ...] ,假设街道名不可能由数字构成,则直接加方括号[]行反义,即 [^ \d]+ 代表重复匹配1次以上任意非数字
Suite 400 .* 由于不是每个地址里X单元是必需的,则 .* 代表可以匹配任意字符并重复 0 次以上
Irvine [^ \d]+ 同前匹配任意位数非数字了 ,
CA \u{2} \u 是匹配任意大写字母,花括号里则是代表匹配的字符长度, \u{2} 代表匹配 2 位大写字母
92612 \d{5}$ \d{5}$ 是匹配5位数字 $ 代表匹配当前文本的末尾
正则还是有很多符号组成的,所幸Alteryx还是提供了一些常见的“密码本“在REGEX工具的倒三角下拉框里
作为用户的您真的没有必要围着正则表达的条条框框,因为正则的确千变万化,在alteryx里你只需遵循写一个试一把的方式来摸索就是了
Alteryx提供了4种运用RegEx工具的方法:Match/Parse/Replace/Tokenize
下面上个不同于官方内置举例的较长正则来讲述alteryx里还会用到的正则语法
(?: ^ \d+)|(?:^\w+)\s[^\d]+,\s.*,\s[^\d]+,\s\u{2}\s\d{5}$
\s 是匹配单个空格
| 是代表or
(?: ^\d+ )是匹配但不捕获任意位数数字,不分配组号
(?: ^\w+ )是匹配但不捕获任意位数的字符汉字数字下划线,不分配组号
Match
Regex Match 根据正则表达式指定的匹配规则返回是否匹配成功,即返回(True/False)
像 (?:^\d+)|(?:^\w+)\s[^\d]+,\s.*,\s[^\d]+,\s\u{2}\s\d{5}$在第三行那个例子中能匹配为True就是靠(?:^\d+)|(?:^\w+)的写法,否则单纯靠(?:^\d+)的规则则会返回False,我们考虑一个好的正则的写法是有远见的精准而不是*死的错杀,像第三行的例子里的Two 和阿拉伯数字2这样,用or这样的运算符,它会先对前置的(?:^\d+)进行匹配,没匹配上再对后置的(?:^\w+)进行匹配
Parse
Regex Parse根据正则表达式指定的匹配规则截取字段成为新列
Replace
Regex Replace根据正则表达式指定的匹配规则把匹配的字符组按照自定义替换的规则进行替换
下图里是对Address栏里按照
1 2 3 4 5 6
((?:^\d+)|(?:^\w+))\s([^\d]+),\s.(*,)\s([^\d]+),\s(\u{2})\s(\d{5}$)的规则(此处6个一级括号亦代表6个组)以$4,$5为替换语言 去实现以第4组字符:第5组字符为内容的替换
Regex Replace 的写法灵活,你也可以用Formula里的RegEx_Replace来实现效果
Tokenize
Regex Tokenize是根据正则表达式指定的匹配规则当作分隔关键字进行分栏/分列
Alteryx中本也有Text to column的工具,不过Regex Tokenize 与之相比灵活在可以匹配反义,或是匹配但不捕获的无视方法,来有选择写入需要的字符
下面与之前官方例子中的[^,]+ 规则相同但是用匹配不捕获的无视的写法
( .+? ) (?: , |$)
捕获任意位数字符但尽可能少重复,直到匹配到逗号或者文本末尾时放手无视
+? 是正则里的一种懒惰限定符(亲可以点文章开头的30分钟入门,去看贪婪和懒惰部分)
当然也有因为写了?重复匹配0次或1次而没出现分隔效果的情况如上图