Python3 – 正規表現 – エスケープとraw文字列

エスケープの問題

正規表現ではいくつかの文字がパターンとしての特別の意味を持つが、その文字そのものをマッチングの対象としたいときにはバックスラッシュ(\)でエスケープする。

さらに検索対象の文字列にバックスラッシュが含まれている場合には、バックスラッシュ自身をエスケープしなければならない(\\)。このようなケースは、ファイルパスの区切りにバックスラッシュが使われている場合やLATexの\begin~\endなど多くある。

下の例は”\bigine”という文字列を検索する場合。

  • 検索される側の文字列のバックスラッシュをエスケープしなければならない(3行目)
    • その文字列をprintしてみると意図したないようになっている(4行目と9行目)
  • 次にパターン文字の方で、”\begin”とそのまま試してみるとヒットしない(5行目と10行目)
    • これは最初の”\b”がPythonのエスケープシーケンス(バックスペース)として解釈されたため
  • そこでバックスラッシュをエスケープしてもヒットしない(6行目と11行目)
    • Pythonでは文字としてのバックすら主として解釈されるが、今度は正規表現として解釈したとき単独の特殊文字としての’\’となるため
  • 2つのバックスラッシュそれぞれをエスケープするようにしてやっとヒットさせることができる(7行目と11行目)

raw文字列

Pythonでは、バックスラッシュを単なる文字として解釈するためのraw文字列が組み込まれていて、文字列リテラルの前に’r’か’R’を付けるだけでよい。”””で囲まれた複数行文字列でも同じ。

また、Python3で文字列変数の文字列をraw文字列に変換するには、repr()関数を使う。ただしその結果はシングルクォートで囲まれているため、それを取り除かなくてはいけない。

また複数行文字列の場合は、リテラルでのr指定と変数へのrepr()適用で結果が異なってくる。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です