RegEx Tool v platformě Alteryx je komponenta využívaná pro vyhledávání textu či ke kontrole zadávaných dat ve formulářích nebo parsování kódu. Regulární výraz (Regular Expression) tvoří soubor dvou typů znaků – literálů (a představuje tak určitý vzor nebo-li masku), které musí hledaný řetězec obsahovat, a pomocných znaků, které umožňují pokročilé možnosti vyhledávání. Vzhledem k jejich konfigurovatelnosti a variabilitě tak získáváme neomezený prostor pro práci s textem, čísly i speciálními znaky.
Co je RegEx?
RegEx je zkratka pro ‘Regular Expression’ (někdy známé jako REGEXP nebo racionální výrazy), ale je to hlavně proces, při kterém se v textu hledá posloupnost znaků (číslic, písmen, symbol), které odpovídají předem dané šabloně/vzoru. Je vám toto povědomé ? Pokud ne, tak si zkusme představit funkci FIND (Ctrl+F) pro hledání textu, ta funguje obdobně, pouze hledaný vzor je definován přesnými znaky toho co chci najít, nikoliv obecným předpisem/šablonou jako tomu je v RegExech.
Příklad:
Pokud budeme mít text „Pracuji v BI firmě zvané Billigence od roku 2020“ a chtěli bychom vyhledat všechna čísla nebo velká písmena, tak bychom museli přes FIND udělat několik iterací hledání:
- jednou pro „A“ pak pro „B“, „C“…„Y“, „Z“ a pro čísla „0“, „1“…„9“ atd.),
- naproti tomu u RegExu stačí napsat obecný zápis [A-Z0-9].
Jak je vidět RegEx je obecný vzor pro hledání shody s textem (pro bližší informace jak shoda/principy a syntaxe fungují a jaké jsou způsoby hledání “rozsahy”, “skupiny” a mnohem víc doporučujeme přečíst předchozí blog).
Co je Alteryx Designer?
Alteryx je nástroj s top UX a drag & drop funkcionalitou umožňující jednoduchou cestu k řešení komplexních analytických problémů bez nutnosti psaní kódu. Díky Alteryxu mají přístup k data science i analytici nebo business uživatelé. Jde o software aplikaci běžící na platformě Windows, která uživatelům poskytuje intuitivní uživatelské rozhraní pro vytváření datových workflow, výsledkem je tedy proces, který provede předem dané úkoly na vstupních datech, přičemž výstupem mohou být hotové analýzy nebo jen předpřipravená data pro další reporting. Uživatelé mohou pomocí principu „drag & drop“ sami využívat příslušné komponenty ze sady nástrojů, spojovat je dohromady, upravovat jejich vlastnosti a vytvářet tak datové toky, transformace, ale i vlastní aplikaci, která spustí tento transformační proces. Výhoda Alteryx Designeru je v tom, že na rozdíl od jiných ETL nástrojů se více a hlouběji soustředí na analytickou a data science oblast.
Možnosti použití RegEx výrazů v Alteryx Designeru
Jak bylo napsáno výše, Alteryx využívá k tvorbě workflow vlastní komponenty a my si podrobně popíšeme dvě z nich. Vzhledem k možnosti jejich konfigurace a variability získáváme téměř nekonečné možnosti pro práci s textem, čísly i speciálními znaky.
Jako první se podíváme na komponentu „RegEx tool“ (dále jen „RegEx“) a poté na komponentu „Formula tool“ (dále jen „Formula“), která pracuje s „RegEx funkcemi“.
RegEx komponenta

Tato komponenta nám umožnuje přirozeně pracovat s RegEx výrazy a definovat, co se má stát v případě shody textu s RegEx vzorem.
V základu máme 4 možnosti akcí v případě shody:
- Replace
- Tokenize
- Parse
- Match

Pojďme si je trochu přiblížit a ukázat jejich využití na příkladech.
Replace

V překladu znamená „nahradit“, tudíž pokud bude shoda mezi textem a RegEx výrazem, tak definuji co chci čím nahradit. Pokud budu mít následující text (datový vstup do komponenty RegEx) a budu chtít skrýt heslo (tzn. nahradit sloupec „Heslo“ hvězdičkami), mohu to udělat právě přes tuto komponentu, kde nadefinuji, že jakýkoliv znak (písmeno, symbol, mezera, číslo…) bude nahrazen znakem *.
Pozn. Místo RegEx výrazu „. “ (tečka) lze použít i jiné výrazy, ale tím, že tečka znamená jakýkoliv symbol, tak se pro tuto operaci hodí nejvíce, obzvláště pokud heslo obsahuje speciální znaky např.: ,.*()§¨?:<>-“!’% a další.

Jedná se o jeden z mnoha příkladů využití této funkce, která by se mohla použít na čištění textu.
- Např. pro odstranění speciálních znaků v daném řetězci bychom použili „[^a-zA-Z0-9 ]“ a nahrazující text by byl prázdný text „“. Tím bychom docílili odstranění prázdných míst a speciálních znaků, apod.

Příklad:
máme větu:

a použitím tohoto výrazu výše dojde k úpravě na: ,
(tj. vymazání speciálních znaků a volných míst)

Tokenize
Druhou možností, jak nastavit komponentu, je volba „tokenizovat“, tzn. že textový řetězec rozdělí (tokenizuje) podle regulárního výrazu, kterému odpovídá do sloupců/řádků, přičemž shodné hodnoty ze vstupního textu vrátí do nově vzniklých sloupců/řádků. Na rozdíl od podobné Alteryx komponenty „TEXT TO COLUMNS“ je zde rozdíl v oddělovači, který ve funkci „Tokenize“ může obsahovat více znaků místo pouhého jednoho. U RegEx komponenty je povoleno více znaků. Na následujícím příkladu si ukážeme, jak tokenizace probíhá a co dělá.
Každá webová stránka má svůj HTML kód, ve kterém je napsaná a součástí této syntaxe jsou i odkazy. Ty se poznají tak, že obsahují tag „<a href>“. Následující obrázek ukazuje, jak se tyto odkazy jednoduše získají ze stránek www.billigence.com. Prvním krokem je stáhnout kód stránky do jednoho pole.

Dále na nově vytvořený záznam se sloupcem „DownloadData“ připojíme komponentu „RegEx“ a nakonfigurujeme na funkci „Tokenize“ tak, že výsledky chci obdržet pro lepší přehlednost v řádcích místo sloupcích. Pojďme rozparsovat RegEx: <a href.*?>.*?</a>.
<a href – najdi přesně znaky „<a href“
. – najdi jakýkoliv znak
*? –najdi předchozí znak v neomezem výsktu
> – najdi přesně “>”
.*? – znovu kombinace předchozích řádků (najdi neomezený počet jakýkoliv znaků)
</a> – najdi přesně textový řetězec “</a>”

Obrázek nám ukazuje, jak lze rychle a přehledně získat všechny odkazy stránky www.billigence.com. V praxi by se tato funkce nechala použít pro základní web scraping. Opět i tuto funkci lze použít i na jiné případy a ukázka slouží jako demonstrativní příklad užití.
Pro úplnost dodám, že pokud chceme řešit pro jiné příklady výsledek do sloupců místo řádků, tak je nutné znát přesný počet sloupců, které je třeba manuálně vyplnit (max 999), zároveň pak pomocí komponenty „Data Cleansing“ odstranit přebytečné prázdné sloupce a případně přes „Transponse“ přepnout do řádku. Proto je vhodné se rozmyslet předem, jak budeme chtít výsledek vědět a vše nastavit včas.
Parse
Tato funkce je velice podobná předchozí, rozdíl je ovšem v jiné konfiguraci komponenty. Při zvolení akce „Parse“ můžeme nadefinovat vlastní názvy sloupců (místo doplněného inkrementu na konci sloupce) a jejich datový typ, který nám bude vyhovovat pro další zpracovaní.
Příkladem zde může být „čištění“ následujícího textu, ze kterého chci dostat jen jména uživatelů.

Bez RegExu bychom museli ověřit, kolikátý znak v pořadí je číslice v textu a pak vzít zleva tento počet znaků mínus 2 (jeden znak pro číslici a druhý znak pro mezeru před ní).
V Alteryxu by se tento případ řešil poněkud přehledněji – viz následující.
Zároveň opět přidáváme rozpad RegExu: (^\D+), kde jednotlivé části znamenají:
() – skupina znaků, tzv. range
^ – začátek textového řetězce
\D – označení znaku, které není číslo
+ – opakuj předchozí znak pro 1 až neomezeně výskytů
Ve výsledku se tedy vrátí veškerý textový řetězec, dokud další znak nebude odpovídat znakům 0 až 9.
Na závěr doplňujeme, že výsledný sloupec je ještě potřeba zbavit přebytečných mezer (funkce „TRIM“ v komponentě „FORMULA“, případně ve stejné komponentě nastavit první velká písmena, protože se jedná o jméno).
Match
Poslední akce z možností komponenty RegEx nám umožnuje ověřit, zda hledaný text odpovídá RegEx výrazu. Výstupem je tedy „True“, pokud odpovídá, a „False“, pokud text neodpovídá RegEx vzorci.
Následující obrázek ukazuje RegEx komponentu, jak validuje, že telefonní číslo je v jednom z následujících formátů (pokud bychom chtěli přidat další telefonní formát, je potřeba upravit RegEx vzor).

Povolené formáty telefonních čísel:

Výsledek validace vypadá následovně:

Pojďme si rozebrat jednotlivé části RegExu “\+\d{3}\s\d{3}\s\d{3}\s\d{3}\s*|\(\d{3}\)\d{3}-\d{3}-\d{3}\s*|\(\+\d{3}\)\d{3}-\d{3}\s\d{3}\s*|\+\d{12}\s*”
| – se v RegExu používá pro logický operátor nebo (OR), proto je RegEx rozdělen na 3 skupiny oddělený tímto operátorem, skupiny používají následující části RegExu
\+ – vezmi znak „+“
\d{3} – vezmi 3 jakékoliv čísla, v řadě
\s – vezmi jednu mezeru „ “
\s* – vezmi nula mezery „ “, pokud existují
\( – vezmi jednu levou závorku
\) – vezmi jednu pravou závorku
– – vezmi jednu pomlčku
\d{12} – vezmi 12 jakýkoliv čísel, v řadě
Při poskládání výše popsaných částí dostaneme jeden dlouhý RegEx, který obsahuje 3 operátory NEBO a kontroluje tak RegEx na 4 povolené formáty viz níže:
\+\d{3}\s\d{3}\s\d{3}\s\d{3}\s*|
\(\d{3}\)\d{3}-\d{3}-\d{3}\s*|
\(\+\d{3}\)\d{3}-\d{3}\s\d{3}\s*|
\+\d{12}\s*
Formula komponenta

V této komponentě lze napsat pomocí funkcí, vlastních proměnných, operátorů a existujících sloupců vlastní úpravu dat. My se zaměříme na výše zmíněné RegExy, ty jsou zde zastoupeny 3 funkcemi, dvě z nich sice byly probrány výše, ale i tak si ukážeme, jak by se použily v této komponentě.
REGEX_CountMatches
Toto je funkce, která v předchozí komponentě není zahrnuta, jejím úkolem je podle napsaného RegEx vzorce spočítat počet znaků v řádku, se kterým jsou shodné.
Pokud bychom chtěli tuto funkci, musíme respektovat její parametry:
REGEX_Match(String ,pattern, icase)
• String
– vstupní text kde má RegEx vyhledávat (může být existující sloupec, nebo pevně zadaný text v uvozovkách)
• Pattern
– RegEx vzorec, který bude hledat v předchozím parametru
• Icase
– udává, zda chceme rozlišovat velká a malá písmena (číslo „1“) nebo je ignorovat (číslo „0“). Tento parametr je volitelný, ale pokud se neuvede, tak se bere icase=0, tzn. ignoruje velikost písmen.
Výsledek v závislosti na „Icase“ parametru (počet shodných znaků s RegExem-) vypadá takto:

Jak je vidět z výsledku, parametr „icase“ může totálně změnit transformaci, proto ho doporučuji vždy vyplňovat a nenechávat jako prázdný, v případě hledání chyb to jistě usnadní práci.
REGEX_Match
Tato funkce je opět jakýmsi klonem z předchozí komponenty a její akce „Match“ tudíž vyhodnocuje, zda celá hodnota hledaného textu odpovídá vzoru RegExu. V případě 100% shody je vrácená hodnota z této funkce rovna „-1“ (True), pokud shoda není, tak funkce vrátí hodnotu „0“ (False). Proto doporučujeme tuto funkci zabalit do IF a upravit výstupy.
Funkce má tvar REGEX_Match(String, pattern, icase) s následujícím popisem parametrů
• String
– vstupní text, kde má RegEx vyhledávat (může být existující sloupec nebo pevně zadaný text v uvozovkách)
• Pattern
– RegEx vzorec, který bude hledat v předchozím parametru
• Icase
(udává, zda chceme rozlišovat velká a malá písmena (číslo „1“) nebo je ignorovat (číslo „0“). Tento parametr je volitelný, ale pokud se neuvede, tak se bere icase=0, tzn. ignoruje velikost písmen)
Výsledkem shody vstupního textu s RegExem je tedy TRUE (hodnota -1) nebo FALSE (hodnota 0), pro lepší přehled jsme použili IF podmínku a doplnili kompletní text výsledku.

Níže je příklad opět s uvedením „icase“ parametru:

Opět při rozdělení na velká a malá písmena dostaneme úplně jiný výsledek. Na druhém obrázku jsme ještě poupravili druhý sloupec, kde používáme výsledek z předchozí transformace pro lepší čtení kódu při hledání chyby nebo úpravy kódu, nicméně obě varianty (-1,0 a True, False) jsou v pořádku.
REGEX_Replace
Tuto funkci známe z předchozí komponenty, kde jsme ji použili pro nahrazení všech znaků ze vstupního textu za hvězdičku a skryli jsme heslo (jen pro vizualizační účely, nikoliv pro změnu a jeho uložení)
Pokud bychom chtěli tuto funkci použít ve „Formula“ komponentě, musíme opět respektovat její parametry.
REGEX_Replace(String, pattern, replace, icase)
• String
– vstupní text, kde má RegEx vyhledávat (může být existující sloupec nebo pevně zadaný text v uvozovkách)
• Pattern
– RegEx vzorec, který bude hledat v předchozím parametru
• Replace
– text/číslo nebo jiný znak, kterým bude nahrazena RegEx shoda předchozího parametru
• Icase
(udává, zda chceme rozlišovat velká a malá písmena (číslo „1“) nebo je ignorovat (číslo „0“). Tento parametr je volitelný, ale pokud se neuvede, tak se bere icase=0, tzn. ignoruje velikost písmen)
Níže je vidět výsledek, jak by vypadalo řešení, kde nahrazuji zkratku „apod.“ plnohodnotným textem „a podobně“. Takto vytvořený sloupec se provede pouze pro hodnoty ze sloupce „[Popis článku]“, kde bude shoda s RegExem. Pokud shoda nebude, do sloupce se jen překopíruje hodnota z původního sloupce.

Nyní příklad bez použití „icase“ parametru.

Rovněž i zde je pak vidět, jak parametr „icase“ ovlivní výstup z komponenty. Stejně jako u předchozích funkcí i zde silně doporučujeme, pro lepší přehlednost, dopisovat nepovinný parametr.
Shrnutí
V tomto blogu jsme si ukázali, jaké jsou možnosti užití RegEx výrazů v Alteryxu, jmenovitě u komponenty „RegEx tool“ včetně ukázek všech 4 akcí, které nám tento nástroj povoluje a u komponenty „Formula“, kde jsme si ukázali a popsali 3 funkce, včetně jejich použití a jak nastavit správně parametry. Spolu s ostatními možnostmi, které poskytuje Alteryx Designer, můžeme vytvořit unikátní transformační proces za relativně krátkou dobu.
Autor článku: Petr Holík, BI Consultant, Billigence