文:Lucia
參考文獻鏈接:
https://community.alteryx.com/t5/Alteryx-Knowledge-Base/Tool-Mastery-RegEx/ta-p/37689
【作者注:由于正則表達翻譯的晦澀,這篇并不是完全逐字編譯的文章刚夺,相當于結(jié)合原文案例和已有正則學習材料的基于自己表達的解說诫惭,特此說明】
——在Alteryx中使用Regex Expression 正則表達式
首先如果您不太了解正則表達式是什么的話焙蚓,可以點擊下面的30分鐘快速入門正則表達式教程
?▼??????????????????????????????????????????????????????????????????????????????????????????????▼
https://www.runoob.com/w3cnote/regular-expression-30-minutes-tutorial.html
?▲?????????????????????????????????????????????????????????????????????????????????????????????▲
簡而言之,正則表達式已經(jīng)是獨立的一門語言,早已嵌入很多的分析工具中,Alteryx也不例外,這種常用于文本挖掘的抽象語言鸣驱,不必死記硬背,就好比工具箱里的各種螺絲——用得上能解決需求就是了蝠咆。
Let‘s Start——>
?Alteryx用戶可以在[Parse] 找到Regex?
對這個圖標我們可以右鍵打開官方內(nèi)置Example 【RegEx.yxmd】
下面是對Example里的設(shè)置進行的解讀
1)Regex Match乃根據(jù)正則表達式指定的匹配規(guī)則返回是否匹配成功踊东,即返回(True/False)
下圖是在Address列中根據(jù) *.-\d{4} 即指定匹配任意字符+”-“+任意四位數(shù)字規(guī)則的正則設(shè)置
2)Regex?Parse乃根據(jù)正則表達式指定的匹配規(guī)則截取字段成為新列
下圖是在Name列中根據(jù)([a-z]+)\s([a-z]+) 即指定匹配任意字母+空格+任意字母的正則表達,截取第一段為First Name 刚操,截取第二段為Last Name
3)Regex?Replace乃根據(jù)正則表達式指定的匹配規(guī)則把匹配的字符組按照自定義替換的規(guī)則進行替換
下圖里是對Address欄里按照(.*), (.*), (.*)\s(\d{5})(-\d{4})?的規(guī)則(此處5個括號5個組)以$4:$2,$3為替換語言??? 去實現(xiàn)以第4組字符:第2組字符闸翅,第3組字符為內(nèi)容的替換
4)Regex?Tokenize是根據(jù)正則表達式指定的匹配規(guī)則當作分隔關(guān)鍵字進行分欄/分列
下圖里是對Address欄里按照[^,]+ 的規(guī)則,即配不含”,”的任意字符各自成組(SET)切成3列
Alteryx本身也會有一些提示語法藏在點擊Regular
Expression旁的倒三角里
此外Alteryx 的Formula中也有正則應用函數(shù)
REGEX_CountMatches(string,pattern,icase)
REGEX_Match(string,pattern,icase)
REGEX_Replace(string,pattern, replace,icase)
看了官方內(nèi)置案例后我們還是回到Alteryx Community 的Tool Mastery系列看看那邊的大俠怎么解說alteryx里的正則表達式吧
先上吐槽漫畫赡茸,論寫正則的逼格
論寫正則的過程
你可以視正則為另一門語言缎脾,它用符號的形式去匹配文本中一串字母字符數(shù)字,是一個對象型語言占卧。
下面舉個栗子
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
在這個國外的地址模式里遗菠,哪一塊是街道門牌哪一塊城市哪一塊是郵編老外一眼便知联喘,但是對于計算機來說這些都是一大段文字,中間有些空格或者分隔符辙纬,它不會在乎這段文字是不是具備地址的特征豁遭。而正則表達式是一種方式去讓計算機和我們?nèi)プR別這些有用信息,下面我們把這段文字翻譯成正則表達吧贺拣!
3345??? ? ? ? ? ? ? ? ? ? ?? ^\d+??????? ^是正則里一行的開頭蓖谢,而\d代表任意數(shù)字(0-9)+代表重復匹配1次以上,像是開頭是數(shù)字的地址靠^\d+就能匹配任意位數(shù)數(shù)字了譬涡,
Michelson Drive??????? [^\d]+???????????? 非數(shù)字的匹配也就是數(shù)字的反義則是加[^...],假設(shè)街道名不可能由數(shù)字構(gòu)成闪幽,則直接加方括號[]行反義,即[^\d]+代表重復匹配1次以上任意非數(shù)字
Suite 400????????????????? .*??????????? 由于不是每個地址里X單元是必需的涡匀,則.* 代表可以匹配任意字符并重復0次以上
Irvine????????????????????????? [^\d]+??????????? 同前匹配任意位數(shù)非數(shù)字了盯腌,
CA???????????????????????????? \u{2}????????????? \u? 是匹配任意大寫字母,花括號里則是代表匹配的字符長度陨瘩,\u{2}代表匹配2位大寫字母
92612??????????????????????? \d{5}$??????????? \d{5}$是匹配5位數(shù)字$代表匹配當前文本的末尾
?正則還是有很多符號組成的腕够,所幸Alteryx還是提供了一些常見的“密碼本“在REGEX工具的倒三角下拉框里
作為用戶的您真的沒有必要圍著正則表達的條條框框,因為正則的確千變?nèi)f化舌劳,在alteryx里你只需遵循寫一個試一把的方式來摸索就是了
Alteryx提供了4種運用RegEx工具的方法:Match/Parse/Replace/Tokenize
下面上個不同于官方內(nèi)置舉例的較長正則來講述alteryx里還會用到的正則語法
(?:^\d+)|(?:^\w+)\s[^\d]+,\s.*,\s[^\d]+,\s\u{2}\s\d{5}$
\s 是匹配單個空格
| 是代表or
(帚湘?: ^\d+)是匹配但不捕獲任意位數(shù)數(shù)字,不分配組號
(甚淡?: ^\w+)是匹配但不捕獲任意位數(shù)的字符漢字數(shù)字下劃線大诸,不分配組號
Match
Regex Match 根據(jù)正則表達式指定的匹配規(guī)則返回是否匹配成功,即返回(True/False)
像?(?:^\d+)|(?:^\w+)\s[^\d]+,\s.*,\s[^\d]+,\s\u{2}\s\d{5}$在第三行那個例子中能匹配為True就是靠(?:^\d+)|(?:^\w+)的寫法材诽,否則單純靠(?:^\d+)的規(guī)則則會返回False,我們考慮一個好的正則的寫法是有遠見的精準而不是限制死的錯殺底挫,像第三行的例子里的Two 和阿拉伯數(shù)字2這樣,用or這樣的運算符脸侥,它會先對前置的(?:^\d+)進行匹配,沒匹配上再對后置的(?:^\w+)進行匹配
Parse
Regex?Parse根據(jù)正則表達式指定的匹配規(guī)則截取字段成為新列
Replace
Regex?Replace根據(jù)正則表達式指定的匹配規(guī)則把匹配的字符組按照自定義替換的規(guī)則進行替換
下圖里是對Address欄里按照
1?????????????? 2???????????????? 3???????????? 4??????????? 5???????????????? 6
((?:^\d+)|(?:^\w+))\s([^\d]+),\s.(*,)\s([^\d]+),\s(\u{2})\s(\d{5}$)的規(guī)則(此處6個一級括號亦代表6個組)以$4,$5為替換語言??? 去實現(xiàn)以第4組字符:第5組字符為內(nèi)容的替換
?Regex Replace 的寫法靈活盈厘,你也可以用Formula里的RegEx_Replace來實現(xiàn)效果
Tokenize
Regex?Tokenize是根據(jù)正則表達式指定的匹配規(guī)則當作分隔關(guān)鍵字進行分欄/分列
Alteryx中本也有Text to column的工具睁枕,不過Regex Tokenize 與之相比靈活在可以匹配反義,或是匹配但不捕獲的無視方法沸手,來有選擇寫入需要的字符
下面與之前官方例子中的[^,]+ 規(guī)則相同但是用匹配不捕獲的無視的寫法
(.+?)(?:,|$)
捕獲任意位數(shù)字符但盡可能少重復外遇,直到匹配到逗號或者文本末尾時放手無視
+?是正則里的一種懶惰限定符(親可以點文章開頭的30分鐘入門,去看貪婪和懶惰部分)
?當然也有因為寫了契吉?重復匹配0次或1次而沒出現(xiàn)分隔效果的情況如上圖