4.2.1 正規表現のシンタクス
正規表現 (すなわち 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 で書き、マッチ対象
の文字列は、'引用符で括って'
書きます。)
"|" や "(" といったいくつかの文字は特殊文字です。
特殊文字は通常の文字の種別を表したり、あるいは特殊文字の周辺にある通常
の文字に対する解釈方法に影響します。
特殊文字を以下に示します:
- "."
- (ドット)
デフォルトのモードでは改行以外の任意の文字にマッチします。
DOTALL フラグが指定されていれば改行も含むすべての文字にマッ
チします。
- "^"
- (キャレット)
文字列の先頭とマッチします。MULTILINE モードでは各改行の直
後にマッチします。
- "$"
- 文字列の末尾、あるいは文字列の末尾の改行の直前にマッチします。例えば、
foo は 'foo' と 'foobar' の両方にマッチします。一方、正規表現
foo$は 'foo' だけとマッチします。興味深いことに、
'foo1\nfoo2\n' を foo.$ で検索し
た場合、通常のモードでは 'foo2' だけにマッチし、MULTILINE
モードでは 'foo1' にもマッチします。
- "*"
- 直前にある RE に作用して、 RE を 0 回以上できるだけ多く繰り返したもの
にマッチさせるようにします。例えば ab* は 'a'、'ab'、あるいは
'a' に任意個数の'b' を続けたものにマッチします。
- "+"
- 直前にある RE に作用して、 RE を、1 回以上繰り返したものにマッチさせる
ようにします。例えば ab+ は 'a' に一つ以上の 'b' が続いたも
のにマッチし、 'a' 単体にはマッチしません。
- "?"
- 直前にある RE に作用して、 RE を 0 回か 1 回繰り返したものにマッチさせ
るようにします。例えば ab? は 'a' あるいは 'ab' にマッチしま
す。
*?
, +?
, ??
- "*"、"+"、 "?" といった修飾子は、すべて
貪欲 (greedy) マッチ、すなわちできるだけ多くのテキストにマッチす
るようになっています。時にはこの動作が望ましくない場合もあります。例え
ば正規表現 <.*> を
'<H1>title</H1>'
にマッチさせると、
'<H1>'
だけにマッチするのではなく全文字列にマッチしてしまいます。
"?"を修飾子の後に追加すると、非貪欲 (non-greedy) ある
いは 最小一致 (minimal) のマッチになり、できるだけ 少ない
文字数のマッチになります。例えば上の式で .*?を使うと
'<H1>'
だけにマッチします。
{m}
- 前にある RE の m 回の正確なコピーとマッチすべきであることを指定
します;マッチ回数が少なければ、RE 全体ではマッチしません。例えば、
a{6} は、正確に 6個の "a" 文字とマッチしますが、
5個ではマッチしません。
{m,n}
- 結果の RE は、前にある RE を、
m回からn 回まで繰り返したもので、
できるだけ多く繰り返したものとマッチするように、マッチします。
例えば、a{3,5}は、3個から 5個の "a" 文字とマッチします。
mを省略するとマッチ回数の下限として0を指定した事になり、
n を省略することは、上限が無限であることを指定します;
a{4,}b は
aaaab
や、千個の "a" 文字に b
が
続いたものとマッチしますが、aaab
とはマッチしません。
コンマは省略できません、そうでないと修飾子が上で述べた形式と混同されてしまうからです。
{m,n}?
- 結果の RE は、前にある RE の
m回からn 回まで繰り返したもので、できるだけ少なく
繰り返したものとマッチするように、マッチします。これは、前の修飾子の
控え目バージョンです。 例えば、
6文字 文字列
'aaaaaa'
では、a{3,5} は、5個の
"a" 文字とマッチしますが、a{3,5}? は3個の文字と
マッチするだけです。
- "\"
- 特殊文字をエスケープする(
"*"や "?"等のような文字との
マッチをできるようにする)か、あるいは、特殊シーケンスの合図です;
特殊シーケンスは後で議論します。
もしパターンを表現するのに raw string を使用していないのであれば、
Python も、バックスラッシュを文字列リテラルでのエスケープシーケンスとして
使っていることを覚えていて下さい;もしエスケープシーケンスを
Python の構文解析器が認識して処理しなければ、そのバックスラッシュと
それに続く文字は、結果の文字列にそのまま含まれます。しかし、もし Python が
結果のシーケンスを認識するのであれば、バックスラッシュを 2回 繰り返さなければ
いけません。このことは複雑で理解しにくいので、
最も簡単な表現以外は、
すべて raw string を使うことをぜひ勧めます。
[]
- 文字の集合を指定するのに使用します。文字は個々に
リストするか、文字の範囲を、2つの文字と"-"でそれらを分離
して指定することができます。特殊文字は集合内では有効ではありません。
例えば、[akm$]は、文字 "a"、"k"、
"m"、あるいは "$"のどれかとマッチします;
[a-z] は、任意の小文字と、
[a-zA-Z0-9]
は、
任意の文字や数字とマッチします。
(以下で定義する) \w
や\S
のような
文字クラスも、範囲に含めることができます。もし文字集合に
"]" や "-" を含めたいのなら、その前にバックスラッシュを
付けるか、それを最初の文字として指定します。たとえば、パターン
[]] は ']'
とマッチします。
範囲内にない文字とは、その集合の補集合をとることで
マッチすることができます。これは、集合の最初の文字として
"^" を含めることで表すことができます;
他の場所にある "^"は、単純に
"^"文字とマッチするだけです。例えば、
[^5] は、
"5"以外の任意の文字とマッチし、
[^^
] は、
"^" 以外の任意の文字とマッチします。
- "|"
A|B
は、ここで A と B は任意の RE ですが、
A か B のどちらかとマッチする正規表現を作成します。任意個数の RE を、
こういう風に "|" で分離することができます。これはグループ
(以下参照) 内部でも同様に使えます。検査対象文字列をスキャンする中で、
"|" で分離された RE は左から右への順に検査されます。
一つでも完全にマッチしたパターンがあれば、そのパターン枝が受理されます。
このことは、もし A
がマッチすれば、たとえB
によるマッチが
全体としてより長いマッチになったとしても、B
を決して検査しないことを
意味します。
言いかえると、"|" 演算子は決して貪欲 (greedy) ではありません。
文字通りの "|"とマッチするには、\| を使うか、
あるいはそれを [|] のように文字クラス内に入れます。
(...)
- 丸括弧の中にどのような正規表現があってもマッチし、
またグループの先頭と末尾を表します;グループの中身は、マッチが
実行された後に検索され、後述する \number
特殊シーケンス付きの文字列内で、後でマッチされます。
文字通りの "(" や ")"とマッチするには、
\( あるいは \) を
使うか、それらを文字クラス内に入れます: [(] [)]。
(?...)
- これは拡張記法です( "("
に続く"?"は他には意味がありません)。
"?"の後の最初の文字が、この構造の意味とこれ以上の
シンタクスがどういうものであるかを決定します。
拡張記法は普通新しいグループを作成しません;
(?P<name>...)がこの規則の唯一の例外です。
以下に現在サポートされている拡張記法を示します。
(?iLmsux)
- ( 集合 "i"、"L"、
"m"、 "s"、"u"、"x"
から1文字以上)。グループは空文字列ともマッチします;文字は、
正規表現全体の対応するフラグ (re.I、 re.L、
re.M、 re.S、
re.U、 re.X ) を設定します。
これはもしflag 引数をcompile()
関数に渡さずに、そのフラグを正規表現の一 部として含めたいならば 役に立ちます。
(?x) フラグは、式が構文解析される
方法を変更することに注意して下さい。
これは式文字列内の最初か、あるいは1つ以上の空白文字の後で使うべきです。
もしこのフラグの前に非空白文字があると、その結果は未定義です。
(?:...)
- 正規表現の丸括弧の非グループ化バージョンです。
どのような正規表現が丸括弧内にあってもマッチしますが、
グループによってマッチされたサブ文字列は、
マッチを実行したあと検索されることも、あるいは後でパターンで
参照されることも できません。
(?P<name>...)
- 正規表現の丸括弧と同様ですが、
グループによってマッチされたサブ文字列は、記号グループ名
nameを介してアクセスできます。グループ名は、正しい Python
識別子でなければならず、各グループ名は、正規表現内で一度だけ定義され
なければなりません。記号グループは、グループに名前が付けられていない場合のように、
番号付けされたグループでもあります。そこで上の例で 'id'という名前がついた
グループは、番号グループ 1 として参照することもできます。
たとえば、もしパターンが
(?P<id>[a-zA-Z_]\w*)であれば、このグループは、
マッチオブジェクトのメソッドへの引数に、
m.group('id')
あるいは m.end('id')
のような名前で、
またパターンテキスト内(例えば、 (?P=id)) や
置換テキスト内( \g<id>
のように) で名前で参照することができます。
(?P=name)
- 前に name と名前付けされたグループに
マッチした、いかなるテキストにもマッチします。
(?#...)
- コメントです;括弧の内容は
単純に無視されます。
(?=...)
- もし ...が次に続くものとマッチすればマッチしますが、
文字列をまったく消費しません。これは先読みアサーション(lookahead assertion)と呼ばれます。
例えば、Isaac (?=Asimov) は、
'Isaac '
に
'Asimov'
が続く場合だけ、'Isaac '
とマッチします。
(?!...)
- もし ... が次に続くものとマッチしなければマッチします。
これは否定先読みアサーション(negative lookahead assertion)です。例えば、
Isaac (?!Asimov)は、
'Isaac '
に
'Asimov'
が続かない場合のみマッチします。
(?<=...)
- もし文字列内の現在位置の前に、
現在位置で終わる ... とのマッチがあれば、マッチします。
これは 肯定後読みアサーション(positive lookbehind assertion)と呼ばれます。
(?<=abc)def は、"abcdef" にマッチを見つけます、
というのは後読みが3文字をバックアップして、含まれているパターンと
マッチするかどうか検査するからです。含まれるパターンは、
固定長の文字列にのみマッチしなければなりません、ということは、
abc や a|b は許されますが、
a* や a{3,4} は許されないことを意味します。
肯定後読みアサーションで始まるパターンは、検索される文字列の
先頭とは決してマッチしないことに注意して下さい;
多分、match() 関数よりは search()関数を使いたいでしょう:
>>> import re
>>> m = re.search('(?<=abc)def', 'abcdef')
>>> m.group(0)
'def'
この例ではハイフンに続く単語を探します:
>>> m = re.search('(?<=-)\w+', 'spam-egg')
>>> m.group(0)
'egg'
(?<!...)
- もし文字列内の現在位置の前に ...との
マッチがないならば、マッチします。これは
否定後読みアサーション(negative lookbehind assertion)と呼ばれます。
肯定後読みアサーションと同様に、含まれるパターンは固定長さの文字列だけに
マッチしなければいけません。否定後読みアサーションで始まるパターンは、
検索される文字列の先頭とマッチすることができます。
(?(id/name)yes-pattern|no-pattern)
- グループに id
が与えられている、もしくは name があるとき、yes-pattern
とマッチします。存在しないときには no-pattern とマッチします。
|no-pattern はオプションで省略できます。例えば
(<)?(\w+@\w+(?:\.\w+)+)(?(1)>) はemailアドレスとマッチする
最低限のパターンです。これは
'<user@host.com>'
や 'user@host.com'
にはマッチしますが、 '<user@host.com'
にはマッチしません。
バージョン 2.4 で 新たに追加 された仕様です。
特殊シーケンスは "\" と以下のリストにある文字から
構成されます。もしリストにあるのが通常文字でないならば、結果の RE は
2番目の文字とマッチします。例えば、
\$ は文字 "$"とマッチします。
\number
- 同じ番号のグループの中身とマッチします。
グループは1から始まる番号をつけられます。例えば、
(.+) \1 は、
'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
- UNICODE フラグが指定されていない場合、
任意の十進数とマッチします;これは集合 [0-9] と同じ意味です。
UNICODE がある場合、Unicode 文字特性データベースで
数字と分類されているものにマッチします。
\D
- UNICODE フラグが指定されていない場合、
任意の非数字文字とマッチします;これは集合 [^0-9] と
同じ意味です。UNICODE がある場合、これは Unicode 文字
特性データベースで数字とマーク付けされている文字以外にマッチします。
\s
- LOCALE と UNICODE フラグが
指定されていない場合、任意の空白文字とマッチします;これは
集合 [ \t\n\r\f\v]と同じ意味です。
LOCALE がある場合、これはこの集合に加えて現在のロケールで
空白と定義されている全てにマッチします。UNICODE が設定されると、
これは [ \t\n\r\f\v] と Unicode 文字特性データベースで
空白と分類されている全てにマッチします。
\S
- LOCALE と UNICDOE がフラグが
指定されていない場合、任意の非空白文字とマッチします;これは
集合 [^ \t\n\r\f\v] と同じ意味です。
LOCALE がある場合、これはこの集合に無い文字と、現在の
ロケールで空白と定義されていない文字にマッチします。UNICODE が
設定されていると、[ \t\n\r\f\v] でない文字と、
Unicode 文字特性データベースで空白とマーク付けされていないものに
マッチします。
\w
- LOCALE とUNICODE フラグが
指定されていない時は、任意の英数文字および下線とマッチします;これは、集合
[a-zA-Z0-9_]と同じ意味です。LOCALEが設定されていると、
集合 [0-9_] プラス 現在のロケール用に英数字として定義されている任意の
文字とマッチします。
もし UNICODE が設定されていれば、
文字 [0-9_] プラス Unicode 文字特性データベースで英数字として分類されて
いるものとマッチします。
\W
- LOCALEと UNICODE フラグが
指定されていない時、任意の非英数文字とマッチします;これは
集合 [^a-zA-Z0-9_]と同じ意味です。
LOCALEが指定されていると、 集合 [0-9_]になく、
現在のロケールで英数字として定義されていない任意の文字とマッチします。
もし UNICODEがセットされていれば、これは
[0-9_] および Unicode 文字特性データベースで
英数字として表されている文字以外のものとマッチします。
\Z
- 文字列の末尾とのみマッチします。
Python 文字列リテラルによってサポートされている標準エスケープの
ほとんども、正規表現パーザに認識されます:
\a \b \f \n
\r \t \v \x
\\
8進エスケープは制限された形式で含まれています:もし第1桁が
0 であるか、もし8進3桁であれば、それは8進エスケープとみなされます。
そうでなければ、それはグループ参照です。文字列リテラルについて、
8進エスケープはほとんどの場合3桁長になります。
リリース 2.5 ,19th September, 2006 更新
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。