TableauPrepの正規表現関数全て使ってみた

# 正規表現とは
正規表現は、文字列のパターンを表現するための特殊な記述法です。
これを使うことで、特定の文字やパターンを検索したり、置換したりすることができます。
例えば、手入力のアンケートデータやファイルの命名規則の表記ズレがあることにより、取ってきたいデータが取れなかったりする場合の正しい表記への置換や、特定のまた電話番号やメールアドレスなど、特定の形式を持つ文字列を抽出するのに正規表現は非常に役立ちます。
今回はそんな知っておくと何かと便利な正規表現関数について具体的な活用シーンを基に活用ご紹介します。



## TableauPrepに用意されている正規表現関数
Tableau Prep Ver.2023.3現在で用意されている正規表現関数は以下の4つです。

| 関数名 | 記法 | 説明 |
|:-----------|------------|------------|
| REGEXP_MATCH | ([対象のデータ], 正規表現) | 対象のデータ内で、正規表現に一致する文字列が存在するかを判定します。真または偽の結果が返され、IF関数と組み合わせて利用する事が多い関数 |
| REGEXP_REPLACE| ([対象のデータ], 正規表現, 置き換え後の文字列)| 対象のデータ内で、正規表現に一致する部分を指定した文字列に置換 |
| REGEXP_EXTRACT|([対象のデータ], 正規表現) | 対象のデータ内で、正規表現に一致する文字列を抽出|
| REGEXP_EXTRACT_NTH| ([対象のデータ], 正規表現, n) | REGEXP_EXTRACTの変種で、抽出する文字列グループの位置を指定 |

それでは説明していきます！


## REGEXP_MATCH と REGEXP_MATCH 
| 関数名 | 記法 | 説明 |
|:-----------|------------|------------|
| REGEXP_MATCH | ([対象のデータ], 正規表現) | 対象のデータ内で、正規表現に一致する文字列が存在するかを判定します。真または偽の結果が返され、IF関数と組み合わせて利用する事が多い関数 |
| REGEXP_REPLACE| ([対象のデータ], 正規表現, 置き換え後の文字列)| 対象のデータ内で、正規表現に一致する部分を指定した文字列に置換 |


説明にもある通り、 REGEXP_MATCH関数は関数の戻り値はTRUE or FALSE のブーリアン型なのでIF関数と組み合わせて利用する事が多い関数です。
そしてREGEXP_REPLACEはReplace処理を正規表現を使用して実施することができる関数です。
この関数を使用すると様々な計算式の簡略化ができますのでどのように使用するのかご紹介します。




## 正規表現関数で計算式をスッキリ！
<br>
以下のような計算式で科目内の「数学 or 科学 or 物理」だった場合には「理数系」と分類するようなデータ処理はよくあるんじゃないかなと思いますが、IFとContainsでの計算式をREGEXP_MATCHを使用することでスッキリ書くことができます。

#### IF Contains　バージョン
```TeX:
IF 
CONTAINS([科目],"数学")
OR CONTAINS([科目],"科学")
OR CONTAINS([科目],"物理")
THEN "理数系"
ELSE "文系"
END
```
#### IF　REGEXP_MATCH　バージョン
```TeX:
IF
REGEXP_MATCH([科目],"数学|理科|物理")
THEN "理数系"
ELSE "文系"
END
```

上記のコードは第一引数に入っている科目のカラムから
| またはの意味で、前のパターンまたは次のパターンを検索しマッチします。


上記の処理をREGEXP_REPLACEを使用するとさらに簡略化・スッキリした計算式にすることができます。

#### IF　REGEXP_REPLACE　バージョン
```TeX:
IF
REGEXP_REPLACE([科目],"数学|理科|物理","理数系")
ELSE "文系"
END
``` 

<br>



#### REGEXP_REPLACEを使用した改行コードの置換
```TeX:
IF
REGEXP_REPLACE([対象のデータ],'\n','-'))
ELSE "文系"
END
```
Contaisでは検索ができない改行コード「\n」を置換や削除する際にもREGEXP_REPLACE有効です。

<br>
<br>

##  REGEXP_EXTRACT
| 関数名 | 記法 | 説明 |
|:-----------|------------|------------|
| REGEXP_EXTRACT|([対象のデータ], 正規表現) | 対象のデータ内で、正規表現に一致する文字列を抽出|



### アンケートデータから電話番号のみを取り出したい
以下はアンケートデータは複数の設問を列ではなく行で持っている際の回答内の電話番号のみ抽出する際の例です。

#### REGEXP_REPLACEを使用した改行コードの置換
```TeX:
REGEXP_EXTRACT([回答], '(\d+)')
```

\d: 任意の数字（0-9）にマッチすることを示します。
+: 直前のパターン（ここでは \d）が1回以上繰り返されることを示します。
例: "080-1234-5678" →  08012345678 



##  REGEXP_EXTRACT_NT
| 関数名 | 記法 | 説明 |
|:-----------|------------|------------|
| REGEXP_EXTRACT_NTH| ([対象のデータ], 正規表現, n) | REGEXP_EXTRACTの変種で、抽出する文字列グループの位置を指定 |
<br>

### カラム名review_textから数値だけを取り出したい
以下のアンケートデータreview_textは:区切りで感想とスコアが記載してあります。
そのような際にスコアのみを抽出したい場合にREGEXP_EXTRACTは非常に有効です。

| review_text                          |
|--------------------------------------|
| すごくおいしい料理でした！: 5      |
| とても感動しました！！: 3           |
| また来たいです。: 4          |
#### REGEXP_EXTRACT_NT使用して、review_textカラムから数値だけを取り出したい
```TeX:
REGEXP_EXTRACT_NTH(review_text, 'Rating: (\d)', 1
```
 ### ↓
| review_text |
|--------|
| 5      |
| 3      |
| 4      |

#### REGEXP_EXTRACT_NTとREGEXP_EXTRACTの違い
REGEXP_EXTRACT: パターンにマッチした最初の部分文字列を返します。
REGEXP_EXTRACT_NTH: 抽出された部分文字列を返します。
REGEXP_EXTRACT_NTHは第三引数でindexをしてできるため、以下のような条件でindexを指定して何番目に一致したものを取得するのかを調整することができます。
以下の文字列の場合
'abc 123 def 456'
```
REGEXP_EXTRACT_NTH('abc 123 def 456', '\\d+', 2)
```
→ 456

## 正規表現は書きたいけど書き方が分からないという方へ
正規表現は書きたいけど書き方が分からないという方は多いと思います。
私もまだまだ勉強中でその1人です💦
    Qiita内の様々な記事でもわかりやすく正規表現についてご説明している方もいるので、これを機に勉強をするのも1つですが最も手っ取り早く私が使う方法はChat GPTに聞いてしまうことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/06f4f418-9d16-f518-bf84-6694456e09c2.png)

今すぐ正規表現を使いたいが書き方がわからない方はぜひ試してみてください。


## おわりに
今回はTableau Prepにおける正規表現関数についてご紹介しました。
正規表現関数は計算式の簡略化やContainsだけでは処理できない改行コードの処理など様々な活用ができる関数です。
正規表現は書きたいけど書き方が分からないという方もChat GPTに聞いてしまえば複雑な正規表現も簡単に使用もできますので、是非試してみてください！

最後までご覧いただきありがとうございました。