▼背景
私はr文字列は「正規表現書くときに''の前に付けるやつ」くらいに認識していた
今回は、このr文字列の意味をr文字列を使わなかった場合と比較して理解することを試みた。
正規表現エンジンはBigQueryにおいて使われているものを想定した。
▼結論
r文字列とは、バックスラッシュ(\
)をエスケープとして処理せず、そのままの文字列として扱う「生の文字列(raw string)」のこと
正規表現ではバックスラッシュ(\
)をよく使うため、バックスラッシュ(\
)をエスケープとして扱わないr文字列を利用することで正規表現を書きやすくしている。
ex) r文字列を使わないと正規表現を書く際に\\d
, \\w
, \\s
などのようにバックスラッシュ(\
)を2個並べる必要が出てきて手間になる。
※ツール(正規表現エンジン)によってバックスラッシュ(\
)をエスケープとみなすかが異なる。使用するツールなどによって確認する必要がある
▼r文字列を使った場合と使っていない場合の比較にて理解を試みる
例えば以下のように、数字2桁にマッチさせたいとする。
r文字列なし
pattern = "\d\d"
この場合、バックスラッシュ(\
)はエスケープだと判断される。そのため、正規表現エンジンは以下のように認識することになる。
pattern = "エスケープ + d + エスケープ + d
これは数字を表す\d
とは認識されないため、正しい正規表現としては処理されない。
これを正しい正規表現に直すと以下。
pattern = "\\d\\d"
1個目の\
によって2個目の\
がエスケープされて正しく\d
だと認識されるようになる。
しかし、正規表現内でよく使うバックスラッシュ(\
)を毎回\\d
のように2個並べるのは面倒だし可読性も悪い。
そこで便利なのがr文字列
r文字列を使った場合
pattern = r"\d\d"
この正規表現は正しく数字2つと認識される。
なぜなら、r文字列を使うことによりバックスラッシュ(\
)がエスケープ文字だと判断されなくなるから。
以上のように、r文字列を使うことで正規表現を扱う際にエスケープ文字であるバックスラッシュ(\
)を気にする必要がなくなる。
▼ツール別エスケープ(バックスラッシュ)の扱い比較
本記事はBigQueryにて使われている正規表現エンジンを想定して説明を行った。しかし、ツールによってはr文字列を使わずともバックスラッシュ(\
)をエスケープ文字だと認識しないことがある。表にまとめる
ツール・環境 | 正規表現で \d を書く方法 |
説明 |
---|---|---|
GA4(条件設定など) | \d |
バックスラッシュはそのまま使える(\\d にする必要なし) |
Google Apps Script | "\\d" |
エスケープ必要(r文字列は使えないが不要な方法もあり) |
Looker Studio |
"\\d" または r"\d"
|
エスケープ必要(r文字列使えば不要) |
BigQuery |
"\\d" または r"\d"
|
エスケープ必要(r文字列使えば不要) |
Python |
"\\d" または r"\d"
|
エスケープ必要(r文字列使えば不要) |
使用するツールがどの正規表現エンジンを使っているかを理解した上で正規表現を記述する必要がありそうだ