本ドキュメントは Pythonのライブラリマニュアルlibre.texの内容を 元にして作成されています。
正規表現(RE)は、それにマッチする文字列の集合を特定します。本モジュール 中の関数は、特定の文字列が与えられた正規表現にマッチするかどうか(あるい は与えられた正規表現が特定の文字列にマッチするかどうか)を検査します。
新しい正規表現を構築するために、正規表現を連結することができます。A と Bの両方が正規表現であるとき、AB もまた正規表現です。あ る文字列 pがAにマッチし、別の文字列 qがBにマッチするので あれば、文字列 pqはABにマッチします。したがってここで説明したよ うに、複雑な正規表現は単純な正規表現から簡単に構築することができるので す。正規表現の理論と実装に関する詳細は、後述するFriedl の本を参照するか、 コンパイラー作成に関する教科書を参照するかしてください。
正規表現の書式に関する簡単な説明を本ドキュメントで行います。
正規表現は、特殊なキャラクター(special character)と通常のキャラクター
(ordinary character)の両方を含むことができます。'A', 'a',
'0'のようなほとんどの通常キャラクターは、それ自身にマッチすると
いう最も単純な正規表現です。通常キャラクターは連結できるので、'last'
は 'last'というキャラクター並びにマッチします(このセクションの残りの部
分では、正規表現をthis special font
のようなフォントを使ってクォ
ートはつけず、マッチする文字列は'in single quotes'のように記述します)。
|
や (
など幾つかのキャラクターは特殊です。
特殊なキャラクターは通常のキャラクターのクラスを表すか、それを囲む正規表現がどのよう
に解釈されるかに影響を及ぼしたりします。
特殊キャラクターは以下の通りです:
デフォルトモードでは、これは改行以外の任意のキャラクターにマッチします。
¥code{DOTALL}フラグが指定されていれば、これは改行を含む任意のキャラクタ
ーにマッチします。^
(Caret) 文字列の先頭にマッチします。
MULTILINE モードの場合には、各改行の直後にもマッチします。
文字列の終端にマッチします。MULTILINE モードの場
合には、各改行の直前にもマッチしますfoo
は 'foo' にも 'foobar'に
もマッチしますが、foo$
という正規表現は 'foo' にのみマッチします。
先行する正規表現要素の0回以上の、可能な限りの回数のくり返しの正規表現と
なります。ab*
は、'a', 'ab', そして'a'の後に任意の個数の'b'が続い
たものにマッチします。
直前の正規表現要素の1回以上のくり返しの正規表現となります。ab+
は、
0ではない個数の'b'が続いたものにマッチします。これは単なる'a'にはマッチ
しません。
先行する正規表現の、0または一回の繰り返しの正規表現となります。
ab?
は、'a' または 'ab'にマッチします。
*
, +
, ?
は、
全て greedy(貪欲)な修飾子
(qualifiers)です。これらは可能な限り長いテキストにマッチします。これは
望んだ動作とはならない場合があります。<.*>
という正規表現は
<H1>title</H1>
にマッチしますが、それは
<H1>
だけではなく文
字列全体にマッチしてしまうのです。修飾子に?
を付加することによっ
てnon-greedyもしくは minimal (最小一致)でマッチングを行うよ
うになります。つまり、可能な限り短いキャラクター列にマッチします。先の
正規表現で.*?
を使うと、<H1>
のみにマッチします。
先行する正規表現の、m 回以上 n 回以下の繰り返しの正規表現と
なります。この繰り返しは、可能な限り大きな回数になるようにされます。た
とえば、, a{3,5}
は三個から五個の'a'の並びにマッチします。
先行する正規表現の、m 回以上 n 回以下の繰り返しの正規表現と
なります。この繰り返しは、可能な限り小さな回数が採用されます。こ
れは一つ前の修飾子のnon-greedyバージョンです。たとえば 'aaaaaa'という六
文字の文字列に対して、a{3,5}?
は三文字しかマッチしません。
特殊キャラクター('*?+¥&¥$'のようなキャラクター)をエスケープするか、特殊 なシーケンスを示します。特殊なシーケンスには以下に挙げるものがあります。
パターンを表現するのにraw stringを使わない場合には、Pythonは文字列リテ ラル中のエスケープシーケンスとしてもバックスラッシュを使ってしまうとい うことを思い出してください。Pythonの構文解析器がエスケープシーケンスを 認識しなければ、バックスラッシュとそれに続くキャラクターは処理後の文字 列にも含まれます。しかし、Pythonが処理後のシーケンスを認識するためには、 バックスラッシュを二回繰り返すようにしたほうが良いでしょう。これはやや こしくて理解しづらいことなので、raw stingを使うことを強くお奨めします。
キャラクターの集合を示すのに使われます。キャラクターは個々に列挙するこ
とも、始点と終点を表す二つのキャラクターを'-'で繋いだ範囲によって指定す
ることもできます。特殊キャラクターは集合の中ではアクティブにはなりませ
ん。たとえば [akm$]
は、 'a', 'k', 'm', '$' のいずれかにマッチ
します。[a-z]
は任意の小文字にマッチし、[a-zA-Z0-9]
は任意
の文字、数字にマッチします。 ¥w
や ¥S
のようなキャラ
クタークラス(後述)も使うことができます。集合に ]
や
-
を含
めたいのならば、その前にバックスラッシュを前置します。
先頭のキャラクターが ^
である集合は、そのリストに含まれない
キャラクターにマッチします。先頭以外にある ^
は単に '^
'
というキャラクターにマッチします。
A|B
とすると、AかBのいずれかにマッチする正規表現を作り出します。
これはグループ(後述)の中でも使うことができます。リテラルとしての
'|
'にマッチさせるためには、¥|
を使うか
[|]
のようにキャラクタークラスの中に押し込めます。
かっこの中に含まれる正規表現にマッチし、同時にグループの始まりと終わり
とを示します。グループの内容はマッチングが行われた後で取り出すことがで
き、また、特殊シーケンス ¥number
によってグループが登場
した後の文字列の部分にマッチできます。リテラルとしての '(' や ')'にマッ
チさせるためには、¥(
や ¥)
とするか、
[(] [)]
のようにキャラクタークラスの中に押し込めます。
以下に挙げるのは拡張記法です( '?'が後続する'('はこれ以外の場合には意味がありませ ん)。'?'の直後のキャラクターがその構造全体が意味する構文を決定します。 以下に現在サポートしている拡張構文を挙げます。
( 'i', 'L', 'm', 's', 'x' の一文字以上の組み合わせ) このグループは空文 字列にマッチします。それぞれの文字は、正規表現全体に対するフラグをそれ ぞれの文字に応じて(re.I, re.L, re.M, re.S, re.X)設定します。これは、 compile関数に flag 引数を渡すのではなく正規表現の一部とし てフラグを含めたいようなときに便利です。
通常のかっこの、グルーピングを行わないバージョンです。これはかっこの内 側にある正規表現にマッチしますが、このグループにマッチしたテキストは以 後のパターンにおいて参照したり取り出したりすることはできません。
通常のかっこと同じ様なものですが、このグループはシンボリックグループ名 nameを通してアクセス可能です。グループ名はPythonにおける正しい識 別子でなければなりません。シンボリックグループは、名前づけされていない グループと同様番号づけされたグループでもあります。ですから、先の例で 'id'と名前がつけられたグループは一番目のグループとして参照することもで きます。
例を挙げましょう。(?P<id>[a-zA-Z_]¥w*)
というパターンが
あったとすると、グループはm.group('id')
や m.end('id')
のように、マッチオブジェクトのメソッドに対する引
数にある名前によって参照することが
できます。そして、パターンテキストにある名前(例 (?P=id)
)や置換テ
キスト(例 ¥g<id>
)で参照することもできます。
あらかじめnameと命名していたグループにマッチしたテキストにマッチ します。
コメントです。括弧の中にある内容は無視されます。
後続が...
にマッチすればマッチしますが、これは文字列を消費しません。
これは先読み表明(lookahead assertion)と呼ばれます。例えば
Isaac (?=Asimov)
は'Asimov'が続いている 'Isaac‾' にマッチします。
後続が¥code{...}にマッチすればマッチしますが、これは文字列を消費しません。
これは否定先読み表明(negative lookahead assertion)と呼ばれます。例えば
Isaac (?!Asimov)
は'Asimov'が続いていない
'Isaac‾' にマッチします。
'¥'を含む特殊なシーケンスとキャラクターを以下に列挙します。 通常のキャラクターが以下のリストになければ、それは 二番目のキャラクターにマッチする正規表現となります。例を挙げると、 ¥$は'$'にマッチします。
(.+) ¥1
は'the the' や '55 55'にマッチします
が、'the end'にはマッチしません(グループの後にある空白に注意)。この特殊
なシーケンスは最初の99個のグループに対してしか使うことができません。
numberの最初の数字が0であるか、numberが三桁の八進数字であ
った場合にはグループのマッチングとは解釈されずにその八進数字の値が表す
キャラクターとして解釈されます。
単語の始まりや末尾にある空文字列にマッチします。単語とは、アルファベッ
トと数字のキャラクターの並びと定義されていますので、単語の終わりは、空
白だとか非アルファベット、あるいは数字以外のキャラクターで示されます。
キャラクター範囲の内側では、¥b
はバックスペースキャラクターを表
します。これはPythonの文字列リテラルとの互換性のためです。
空文字列にマッチししますが、それが単語の始まりや末尾にある場合にはマッ チしません。
数字にマッチします。これは [0-9]
と等価です。
数字でないキャラクターにマッチします。これは
[¥^0-9]
と等価です。
空白(whitespace)キャラクターにマッチします。これは
[ ¥t¥n¥r¥f¥v]
の集合と等価です。
非空白(non-wihtespace)キャラクターにマッチします。これは
[^ ¥t¥n¥r¥f¥v]
と等価です。
LOCALEフラグが指定されていない場合には、任意のアルファベットおよび数字
にマッチします。これは[a-zA-Z0-9_]
と等価になります。LOCALE指定が
ある場合には[0-9_]
と、カレントのロカールで文字と定義されているキ
ャラクターにマッチします。
LOCALEフラグが指定されていない場合には、アルファベットでも数字でもない
キャラクタにマッチします。これは[^a-zA-Z0-9_]
と等価です。LOCALE
指定がある場合には[0-9_]
でもなくカレントロカールで文字と定義され
ているものでもないキャラクターにマッチします。
文字列の終端にのみマッチします。
バックスラッシュそのものにマッチします。