Python3 – 正規表現 – 選択演算子’|’とfindall/finditerの注意点

findall()finditer()のパターン文字列で選択演算子'|'を用いるとき、選択文字列の順序によって結果が変わってくる点に注意が必要。

たとえばreモジュール関数の場合、以下の例のようになる。

'aa|aaa'とした場合以下の順番でマッチしていく。

  • "a,|aa|,|aa|a,aaaa,aaaaa"
  • "a,|aa|,|aa|a,|aa|aa,aaaaa"
  • "a,|aa|,|aa|a,|aa|aa|,aaaaa"
  • "a,|aa|,|aa|a,|aa|aa|,|aa|aaa"
  • "a,|aa|,|aa|a,|aa|aa|,|aa|aa|a"

'aaa|aa'とした場合は以下の順番でマッチしていく

  • "a,|aa|,aaa,aaaa,aaaaa"
  • "a,|aa|,|aaa|,aaaa,aaaaa"
  • "a,|aa|,|aaa|,|aaa|a,aaaaa"
  • "a,|aa|,|aaa|,|aaa|a,aaaaa"
  • "a,|aa|,|aaa|,|aaa|a,|aaa|aa"
  • "a,|aa|,|aaa|,|aaa|a,|aaa|aa|"

つまり、各マッチングの段階で選択演算子'|'の左側からマッチする部分をまず探し、該当しなければ演算子の右へと判定パターンを変えていく。

このため、演算子の左のパターンが右のパターンより短いと、先にそちらがマッチングされるので右の長いパターンがマッチしなくなることがある。

この動作は、正規表現オブジェクトのメソッドについても同じ。

 

 

コメントを残す

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