👌

JavaScriptとPythonを用いて文字列を置換処理をさせるときの第2引数について

2025/01/31に公開

今まで両言語ともに文字列を置換させるときには第二引数に置換後の文字列を記述するのが
ほとんどで、Pythonre.sub を用いて文字を置換処理させるときには、
re.sub の第二引数の値は置換後の文字列だと思っていたが、それは間違いで 公式(https://docs.python.org/ja/3/library/re.html) を読んでみると

もし repl が関数であれば、重複しない pattern が発生するたびにその関数が呼ばれます。
この関数は一つの Match 引数を取り、置換文字列を返します

という記述があり、第二引数には関数を渡すことができる。

例えばある文字列のなかで、文字の長さが3以上のときには文字列の先頭を大文字にする(capitalize)と考えた時、

"apple of banana" => "Apple of Banana"

以下のように記述できる。

#sが対象となる文字列
re.sub(r'\S{3,}', lambda m: m.group(0).title(), s)

そしてJavaScriptと関しても同様で第二引数に関数を渡すことができ、こちらは replace 関数を使えるので便利である。

s.replace(/\S{3,}/g, w => w.slice(0, 1).toUpperCase() + w.slice(1).toLowerCase());

両言語ともに第二引数の関数の引数として適時マッチした文字列が渡されて、
それに対して処理を行なっていく。

今まで内包表記などで ifで判定していたことがほとんどだったので
このように一行で書けるととても綺麗なコードになる。

Discussion