正規表現 (すなわち RE) は、表現にマッチ (match) する文字列の集合を表し ています。このモジュールの関数を使えば、ある文字列が指定の正規表現にマッ チするか (または指定の正規表現がある文字列にマッチするか、つまりは同じ ことですが) を検査できます。
正規表現を連結すると新しい正規表現を作れます。A と B が ともに正規表現であれば AB も正規表現です。一般的に、文字列 p が A とマッチし、別の文字列 q が B とマッチすれば、文 字列 pqは AB にマッチします。ただし、この状況が成り立つのは、 A と B との間に境界条件がある場合や、番号付けされたグルー プ参照のような、優先度の低い演算をA や B が含まない場合 だけです。 かくして、ここで述べるような、より簡単でプリミティブな正規表現から、 複雑な正規表現を容易に構築できます。正規表現に関する理論と実装の詳細に ついては上記の Friedl 本か、コンパイラの構築に関する教科書を調べて下さ い。
以下で正規表現の形式に関する簡単な説明をしておきます。より詳細な情報や よりやさしい説明に関しては、http://www.python.org/doc/howto/からアクセスできる正規表現ハウツウを調べて下さい。
正規表現には、特殊文字と通常文字の両方を含められます。"A"、
"a"、あるいは "0"のようなほとんどの通常文字は最も
簡単な正規表現になります。こうした文字は、単純にその文字自体にマッチし
ます。通常の文字は連結できるので、last は文字列
'last'
とマッチします。(この節の以降の説明では、正規表現を引用符
を使わずにこの表示スタイル: special style で書き、マッチ対象
の文字列は、'引用符で括って'
書きます。)
"|" や "(" といったいくつかの文字は特殊文字です。 特殊文字は通常の文字の種別を表したり、あるいは特殊文字の周辺にある通常 の文字に対する解釈方法に影響します。
特殊文字を以下に示します:
*?
, +?
, ??
'<H1>title</H1>'
にマッチさせると、
'<H1>'
だけにマッチするのではなく全文字列にマッチしてしまいます。
"?"を修飾子の後に追加すると、非貪欲 (non-greedy) ある
いは 最小一致 (minimal) のマッチになり、できるだけ 少ない
文字数のマッチになります。例えば上の式で .*?を使うと
'<H1>'
だけにマッチします。
{m}
{m,n}
aaaab
や、千個の "a" 文字に b
が
続いたものとマッチしますが、aaab
とはマッチしません。
コンマは省略できません、そうでないと修飾子が上で述べた形式と混同されてしまうからです。
{m,n}?
'aaaaaa'
では、a{3,5} は、5個の
"a" 文字とマッチしますが、a{3,5}? は3個の文字と
マッチするだけです。
もしパターンを表現するのに raw string を使用していないのであれば、 Python も、バックスラッシュを文字列リテラルでのエスケープシーケンスとして 使っていることを覚えていて下さい;もしエスケープシーケンスを Python の構文解析器が認識して処理しなければ、そのバックスラッシュと それに続く文字は、結果の文字列にそのまま含まれます。しかし、もし Python が 結果のシーケンスを認識するのであれば、バックスラッシュを 2回 繰り返さなければ いけません。このことは複雑で理解しにくいので、 最も簡単な表現以外は、 すべて raw string を使うことをぜひ勧めます。
[]
[a-zA-Z0-9]
は、
任意の文字や数字とマッチします。
(以下で定義する) \w
や\S
のような
文字クラスも、範囲に含めることができます。もし文字集合に
"]" や "-" を含めたいのなら、その前にバックスラッシュを
付けるか、それを最初の文字として指定します。たとえば、パターン
[]] は ']'
とマッチします。
範囲内にない文字とは、その集合の補集合をとることで
マッチすることができます。これは、集合の最初の文字として
"^" を含めることで表すことができます;
他の場所にある "^"は、単純に
"^"文字とマッチするだけです。例えば、
[^5] は、
"5"以外の任意の文字とマッチし、
[^^
] は、
"^" 以外の任意の文字とマッチします。
A|B
は、ここで A と B は任意の RE ですが、
A か B のどちらかとマッチする正規表現を作成します。任意個数の RE を、
こういう風に "|" で分離することができます。これはグループ
(以下参照) 内部でも同様に使えます。検査対象文字列をスキャンする中で、
"|" で分離された RE は左から右への順に検査されます。
一つでも完全にマッチしたパターンがあれば、そのパターン枝が受理されます。
このことは、もし A
がマッチすれば、たとえB
によるマッチが
全体としてより長いマッチになったとしても、B
を決して検査しないことを
意味します。
言いかえると、"|" 演算子は決して貪欲 (greedy) ではありません。
文字通りの "|"とマッチするには、\| を使うか、
あるいはそれを [|] のように文字クラス内に入れます。
(...)
(?...)
(?iLmsux)
(?x) フラグは、式が構文解析される 方法を変更することに注意して下さい。 これは式文字列内の最初か、あるいは1つ以上の空白文字の後で使うべきです。 もしこのフラグの前に非空白文字があると、その結果は未定義です。
(?:...)
(?P<name>...)
たとえば、もしパターンが
(?P<id>[a-zA-Z_]\w*)であれば、このグループは、
マッチオブジェクトのメソッドへの引数に、
m.group('id')
あるいは m.end('id')
のような名前で、
またパターンテキスト内(例えば、 (?P=id)) や
置換テキスト内( \g<id>
のように) で名前で参照することができます。
(?P=name)
(?#...)
(?=...)
'Isaac '
に
'Asimov'
が続く場合だけ、'Isaac '
とマッチします。
(?!...)
'Isaac '
に
'Asimov'
が続かない場合のみマッチします。
(?<=...)
>>> import re >>> m = re.search('(?<=abc)def', 'abcdef') >>> m.group(0) 'def'
この例ではハイフンに続く単語を探します:
>>> m = re.search('(?<=-)\w+', 'spam-egg') >>> m.group(0) 'egg'
(?<!...)
(?(id/name)yes-pattern|no-pattern)
'<user@host.com>'
や 'user@host.com'
にはマッチしますが、 '<user@host.com'
にはマッチしません。
バージョン 2.4 で 新たに追加 された仕様です。
特殊シーケンスは "\" と以下のリストにある文字から 構成されます。もしリストにあるのが通常文字でないならば、結果の RE は 2番目の文字とマッチします。例えば、 \$ は文字 "$"とマッチします。
\number
'the the'
あるいは '55 55'
とマッチしますが、
'the end'
とはマッチしません(グループの後のスペースに注意して下さい)。
この特殊シーケンスは最初の 99 グループのうちの一つとマッチするのに使うことが
できるだけです。もし numberの最初の桁が 0 である、すなわち
numberが 3 桁の8進数であれば、それはグループのマッチとは解釈されず、
8進数値 number を持つ文字として解釈されます。
文字クラスの "["と "]"の中の数値エスケープは、文字として
扱われます。
\A
\b
\b
は、\w
と \W
の間の境界として定義されているので、
英数字であると見なされる文字の正確な集合は、UNICODE
とLOCALE
フラグの
値に依存することに注意して下さい。
文字の範囲の中では、\b は、
Python の文字列リテラルと互換性を持たせるために、
後退(backspace)文字を表します。
\B
\b
のちょうど反対ですので、
LOCALE
とUNICODE
の設定にも影響されます。
\d
\D
\s
\S
\w
\W
\Z
+
Python 文字列リテラルによってサポートされている標準エスケープの ほとんども、正規表現パーザに認識されます:
\a \b \f \n \r \t \v \x \\
8進エスケープは制限された形式で含まれています:もし第1桁が 0 であるか、もし8進3桁であれば、それは8進エスケープとみなされます。 そうでなければ、それはグループ参照です。文字列リテラルについて、 8進エスケープはほとんどの場合3桁長になります。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。