Python正規表現における "$" 文字の動作の理解
- Pythonの
re モジュールを使う際、^ は「文字列の先頭」を意味し、$ は「文字列の末尾」を意味すると一般に知られている。
- しかし
$ は常に「文字列の末尾」だけを意味するわけではなく、プラットフォームによって動作が異なる場合がある。
- Pythonではマルチラインモードが無効なとき、
$ 文字は文字列の末尾、または文字列末尾の改行文字の直前にマッチすることがある。
文字列末尾と改行文字へのマッチの違い
- マルチラインモードが無効な状態で、Pythonで改行文字なしに文字列の末尾へマッチさせたい場合、
$ だけを使ってはいけない。
- 文字列の末尾にマッチさせるには
\z と \Z を使うことができる。
- Pythonで
re.MULTILINE を使うと、$ は文字列の末尾と各行の末尾(改行文字の直前)にマッチする。
さまざまなプラットフォームでの正規表現の動作比較
- 複数のプラットフォームで
cat\n に対するパターン一致の可否を比較した表から、改行文字を含めた一致が許容されるなら、マルチラインモードで $ を使うのが一貫した動作になることがわかる。
- 改行文字を含めずにマッチさせたい場合、PythonとECMAScriptを除くすべてのプラットフォームでは
\z を使い、PythonとECMAScriptではそれぞれ \Z またはマルチラインモードなしの $ を使う必要がある。
GN⁺の見解
- この記事は、正規表現を使う開発者に対して、Pythonにおける
$ 文字の予想外の動作への注意を促す内容になっている。
- 正規表現は文字列処理において非常に強力だが、プラットフォームごとに異なる動作を示すことがあるため注意が必要であることを強調している。
- 開発者はこうした違いを認識し、クロスプラットフォームアプリケーションを開発する際に互換性の問題を避けるため、追加のテストを行う必要がある。
- 類似の機能を提供する他の正規表現ライブラリとしては、Javaの
java.util.regex、.NETの System.Text.RegularExpressions などがあり、これらもそれぞれのプラットフォームに合わせた動作の違いを理解したうえで使う必要がある。
- 新しい正規表現の構文や動作を導入する際には、既存コードとの互換性、性能への影響、そしてチーム内での学習コストを考慮し、その変更がもたらす利点とコストを十分に評価する必要がある。
1件のコメント
Hacker Newsの意見
\wの代わりに\s_-(あるいはリファレンスなしでは画面に何かが出るもの)を使うが、Emacs は文書化と発見しやすさの点で最高だ。\Aと\Z、またはそれに相当するものを使う。