正規表現(すなわち RE)は、それとマッチする文字列の集合を指定します; このモジュールの関数によって、特別な文字列が与えられた正規表現と マッチするかどうか(あるいは与えられた正規表現が特別な文字列と マッチするかどうか、これは結局同じことになりますが)を検査できます。
正規表現は、連結して新しい正規表現を作ることができます; もし 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'
とマッチします。(このセクションの
残りでは、RE を普通引用符なしで この特殊な形式で書き、
マッチされる文字列は、'単一引用符内'
に書きます。)
"|" や "("のようないくつかの文字は特殊文字です。 特殊文字は通常文字クラスを表すか、あるいは通常文字に関する 正規表現がどのように解釈されるかに影響します。
特殊文字は:
*?
, +?
, ??
'<H1>title</H1>'
とマッチさせると、これは、全文字列とマッチし、
'<H1>'
だけとはマッチしません。"?"を修飾子の後に追加すると、
控え目な(non-greedy) あるいは 最小 風のマッチをするようになります;
できるだけ 少ない 文字とマッチします。前の式で .*?を使うと、
'<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'
(?<!...)
特殊シーケンスは "\" と以下のリストにある文字から 構成されます。もしリストにあるのが通常文字でないならば、結果の 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進エスケープとみなされます。 そうでなければ、それはグループ参照です。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。