re – 正規表現の操作¶

正規表現の構文¶

正規表現 (or RE) は、それにマッチする文字列のセットを指定します。このモジュールの関数は、特定の文字列が与えられた正規表現にマッチするかどうかをチェックできます (または与えられた正規表現は、特定の文字列に一致しますが、結局は同じことになります)。

正規表現は連結して新しい正規表現を作ることができ、A と B がともに正規表現であれば、AB も正規表現となる。一般に、文字列 p が A にマッチし、別の文字列 q が B にマッチすれば、pq は AB にマッチする。 これは、AまたはBが低い優先順位の操作を含んでいたり、AとBの間に 境界条件があったり、番号付きのグループ参照を持つ場合を除き、成立します。 このように、複雑な式は、ここで説明したような単純な基本式から容易に 構成することができる。 正規表現の理論と実装の詳細については,Friedlの本,あるいはコンパイラの構築に関するほとんどすべての教科書を参照されたい. より詳細な情報と優しい表現については、正規表現HOWTOを参照してください。 'A''a''0' のようなほとんどの普通の文字は、最も単純な正規表現であり、単にそれ自身にマッチするだけです。 普通の文字を連結することができ、last'last' という文字列にマッチします。 (このセクションの残りの部分では、REをthis special style、通常は引用符なしで、マッチする文字列を'in single quotes'と書く。)

'|''('などのいくつかの文字は特別なものである。

繰り返し修飾子 (*, +, ?, {m,n}, etc) は間接的にネストさせることはできません。 これは、非貪欲な修飾子接尾辞?や他の実装の修飾子との曖昧さを避けるためです。 内側の繰り返しに2番目の繰り返しを適用するには、括弧を使用することができる。

特殊文字は、

.

(ドット)である。

^

(キャレット) 文字列の先頭にマッチし、MULTILINE モードでは各改行直後にもマッチする。

$

文字列の末尾または末尾の改行の直前、MULTILINE モードでは改行の前にもマッチする。 foo は ‘foo’ と ‘foobar’ の両方にマッチし、正規表現 foo$ は ‘foo’ のみにマッチする。 さらに興味深いことに、foo.$'foo1\nfoo2\n' で検索すると、通常は ‘foo2’ にマッチしますが、MULTILINE モードでは ‘foo1’ にマッチします。$ をひとつ 'foo\n' で検索すると、改行の直前と文字列の末尾の 2 つの (空の) マッチがあります。 ab* は ‘a’, ‘ab’, または ‘a’ に続く ‘b’ にマッチします。

+

Cause the resulting RE to match 1 or more repetitions of the preceding RE.ab+ will match ‘a’ followed by any non-zero number of ‘b’; it won’t match just ‘a’.Cause the result to the 1 or more repetitions of the preceding RE.

?

結果の RE が直前の RE の 0 回または 1 回の繰り返しにマッチします。ab? は ‘a’ または ‘ab’ にマッチします。

*?,+?,??

'*''+' および '?' 修飾子もすべて欲張りなので、できる限り多くのテキストとマッチングされます。 RE<.*>'<a> b <c>' とマッチした場合、'<a>' だけでなく文字列全体とマッチしてしまいます。 修飾子の後に ? を追加すると、欲張らない、あるいは最小限の方法でマッチを実行します。 RE <.*?> を使うと、'<a>'だけにマッチします。

{m}

前の RE のちょうど m 個のコピーにマッチするように指定します; 少ないermatches では 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' または 1000 文字の 'a' の後に 'b' が続くものにマッチしますが、'aaab' にはマッチしません。

{m,n}?

結果のREが先行するREのmからn個の繰り返しにマッチし、できるだけ少ない繰り返しにマッチするようにします。 これは、前の修飾子の欲のないバージョンである。 例えば、6 文字の文字列 'aaaaaa' に対して、 a{3,5} は 5 文字の 'a' にマッチし、 a{3,5}? は 3 文字にマッチする。

\

特殊文字をエスケープするか ('*''?' といった文字をマッチできるようにする)、 特殊シーケンスを通知するか、特殊シーケンスについては後で説明する。

パターンを表現するために生の文字列を使用していない場合、Pythonalsoは文字列リテラルでエスケープシーケンスとしてバックスラッシュを使用することを覚えておいてください; Pythonのパーサーがエスケープシーケンスを認識しない場合、バックスラッシュとその後の文字は結果文字列に含まれます。 しかし、Pythonが結果のシーケンスを認識する場合、バックスラッシュは2回繰り返されなければなりません。 これは複雑で理解しにくいので、最も単純な式を除いては、文字列を使用することを強くお勧めします。 例えば、'a''m''k'にマッチする。

  • 2 つの文字を '-' で区切って、文字の範囲を示すこともできる。例えば、 は任意の ASCII 小文字、00 から 59 までのすべての二桁の数字、 は任意の 16 進数にマッチングする。 - がエスケープされた場合 (例: ) または最初か最後の文字として置かれた場合 (例: または ) は、リテラル '-' にマッチします。

  • 特殊文字は集合内で特殊意味を失います。 例えば、 はリテラル文字 '(', '+', '*', ')' のいずれかにマッチします。

  • \w\S のような文字クラスもセット内部で受け入れられます(以下に定義)が、それらがマッチする文字は ASCII または LOCALE モードかによって決まります。

  • 範囲外の文字は、セットを補完することによってマッチさせることができる。 集合の最初の文字が '^' の場合、集合に含まれないすべての文字がマッチします。 例えば,'5'以外のすべての文字にマッチし,'^'以外のすべての文字にマッチする。 ^ はセットの最初の文字でなければ特別な意味はありません。

  • セット内のリテラル ']' にマッチするには、その前にバックスラッシュを置くか、セットの最初に置いてください。 例えば、{}]() は両方とも括弧にマッチします。

  • Unicode TechnicalStandard #18 のように入れ子セットとセット操作を将来的にサポートする可能性があります。

    (...)

    Match whatever regular expression is inside the parenthes, and indicate the start and end of a group; the content of a group can be retrieve after a match has been performed, and can be matched later in the string with the \numberspecial sequence, described below.これはリテラル ' から始まるセットを含む、構文の変更になりますので、この変更に合わせて当面は FutureWarning が曖昧な場合に発生します。 リテラル '('')' にマッチさせるには、 \(\) を使うか、文字クラスで囲むとよいでしょう。 , .

    (?...)

    これは拡張表記です('('に続く'?'はそれ以外では意味を持ちません)。 '?'の後の最初の文字が、その構成要素の意味とさらなる構文を決定します。 通常、拡張機能は新しいグループを作成しませんが、(?P<name>...) はこのルールの唯一の例外です。

    (?aiLmsux)

    (集合 'a', 'i', 'L', 'm', 's', 'u', 'x' から一つ以上の文字). グループは空文字列とマッチし,文字は対応するフラグを設定する。 re.A (ASCII only matching), re.I (ignore case), re.L (locale dependent), re.M (multi-line), re.S (dot matches all), re.U (Unicode matching), re.X (verbose), 正規表現全体。 (Flags are described in Module Contents.) この機能はre.compile()関数にフラグの引数を渡さず、正規表現の一部として フラグを含めるときに便利です。

    (?:...)

    正規の括弧の捕捉しないバージョンです。 括弧の中にある正規表現にマッチしますが、グループによってマッチした部分文字列は、マッチの実行後に取得したり、パターンの後半で参照したりすることができません。

    (?aiLmsux-imsx:...)

    (集合 'a', 'i', 'L', 'm', 's', 'u', 'x' から0文字以上、オプションとして '-' に続き、'i', 'm', 's', 'x' から1文字以上の文字が続く。)これらの文字は、式の部分に対して re.A (ASCII only matching), re.I (ignore case), re.L (locale dependent), re.M (multi-line), re.S (dot matches all), re.U (Unicode matching), re.X (verbose) に相当するフラグの設定または削除を行う。(フラグについてはモジュールの内容で説明しています。)

    'a''L''u' はインラインフラグとして使う場合、互いに排他的なので、組み合わせたり '-' に続けたりすることはできない。 その代わり、インライングループの中にこれらの文字が現れると、それを囲むグループのマッチングモードが上書きされます。 Unicodeパターンでは、(?a:...)はASCIIのみのマッチングに、(?u:...)はUnicodeマッチングに切り替えます(デフォルト)。 バイト・パターンでは、(?L:...) はロケール依存のマッチングに、(?a:...) はASCIIのみのマッチングに切り替えます (既定)。このオーバーライドは狭いインライン・グループに対してのみ有効で、グループの外では元のマッチング・モードが復元されます。

    Change in version 3.7: 文字 'a', 'L', 'u' もグループ内で使用可能。

    (?P<name>...)

    通常の括弧に似ていますが、グループによって一致する部分文字列はシンボリックグループ名名でアクセスすることが可能です。 グループ名は有効なPython識別子でなければならず、各グループ名は正規表現内で一度だけ定義されなければなりません。

    名前付きグループは3つのコンテキストで参照することができます。 パターンが(?P<quote>).*?(?P=quote)の場合 (例. 一重引用符または二重引用符で引用された文字列にマッチする)。

    処理時

    グループ “quote” への参照のコンテキスト

    参照方法

    同じパターン自体で

    • (?P=quote) (表示)

    matchオブジェクトm

    • m.group('quote')

    • m.end('quote') (その他)。)

    re.sub()

    • \g<quote>

    • の再引数に渡した文字列に含まれる。

    • \g<1>

    (?P=name)

    名前付きグループへの後方参照を行うことができます。 name という名前のグループによってマッチされたすべてのテキストにマッチします。

    (?#...)

    コメント: 括弧の内容は単に無視されます。

    (?=...)

    次に ... がマッチした場合にマッチしますが、文字列は一切消費されません。 これはルックアヘッドアサーションと呼ばれる。 例えば、Isaac (?=Asimov)'Asimov' に続く場合のみ 'Isaac ' にマッチする。

    (?!...)

    もし ... が次にマッチしなければ、マッチする。 例えば、Isaac (?!Asimov)'Asimov' に続いていなければ 'Isaac ' にマッチする。

    (?<=...)

    文字列の現在の位置の前に、現在の位置で終了する ... にマッチするものがあれば、それにマッチする。 これは正のlookbehindassertionと呼ばれる。 (?<=abc)def'abcdef' にマッチしますが、これは lookbehind が3文字前に戻って、含まれるパターンがマッチするかどうかを調べるからです。含まれるパターンはある一定の長さの文字列にのみマッチしなければなりません。 正の lookbehind アサーションで始まるパターンは、検索される文字列の先頭ではマッチしないことに注意してください; ほとんどの場合、match() 関数ではなく、search() 関数を使用します:

    >>> import re>>> m = re.search('(?<=abc)def', 'abcdef')>>> m.group(0)'def'

    この例は、ハイフンの後に単語を探します:

    >>> m = re.search(r'(?<=-)\w+', 'spam-egg')>>> m.group(0)'egg'

    Version 3 で変更。5: 固定長のグループ参照のサポートを追加しました。

    (?<!...)

    文字列内の現在の位置が...に一致するものが前にない場合に一致します。 これは負のルックハインドアサーションと呼ばれます。 正の探索アサーションと同様に、含まれるパターンはある一定の長さの文字列にのみマッチする必要があります。

    (?(id/name)yes-pattern|no-pattern)

    Will try to match with yes-pattern if the group with given id orname exists, and if it doesn’t have a no-pattern for the group with given id or name. no-patternはオプションで、省略可能です。 例えば、(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$) は電子メールにマッチしないパターンで、'<[email protected]>''[email protected]' にはマッチしますが、'<[email protected]''[email protected]>' にはマッチしません。

    特殊シーケンスは、'\' と以下のリストからの1文字から成ります。 例えば、$'$'という文字にマッチします。

    \number

    は同じ番号のグループの内容にマッチします。 例えば、(.+) 'the the'または'55 55'にマッチしますが、'thethe'にはマッチしません(グループの後にスペースがあることに注意してください)。 この特別なシーケンスは、最初の99のグループのうちの1つにのみ使用できます。 数値の1桁目が0であったり、数値が8進数で3桁の場合は、グループマッチとして解釈されず、8進数の数値を持つ文字として解釈されます。

    \A

    文字列の先頭のみにマッチします。

    \b

    空文字列にもマッチしますが、単語の先頭または末尾にのみマッチします。 なお、正式には \b\w\W の間(またはその逆)、あるいは \w と文字列の先頭/末尾の間の境界として定義されています。r'\bfoo\b''foo', 'foo.', '(foo)', 'bar foo baz' にはマッチしますが、'foobar''foo3' にはマッチしません。

    Unicode パターンでは、デフォルトで英数字が使われますが、これは ASCII フラグにより変更可能です。

    \B

    空文字列にマッチするが、単語の最初か最後にないときのみ。 つまり、r'py\B''python', 'py3', 'py2' にはマッチしますが、'py', 'py.', 'py!' にはマッチしません。\B\b のちょうど反対で、したがって Unicodepatterns における単語文字は Unicode 英数字かアンダースコアになります(これは ASCII フラグで変えることができます)が、このフラグがある場合は、空文字にマッチします。

    \d Unicode (str) パターンでは、単語の境界は現在のロケールによって決定されます。

    Match any Unicode decimal digit (すなわち,Unicode character category に含まれる任意の文字)。 これには が含まれ、また他の多くの数字文字も含まれます。 ASCII フラグを使用すると、 にのみマッチします。

    8-bit (bytes) パターン。

    10進数の任意の文字にマッチします。これは と同じです。 \dの逆。 ASCII フラグを使用した場合,.

    \s と同じになります。

    Unicode の空白文字にマッチします( を含み、他の多くの文字、例えば、多くの言語の組版規則で義務付けられている改行されない空白も含みます)。

    8-bit (bytes) パターンの場合。

    ASCII 文字セットで空白文字とみなされる文字にマッチします;これは と同じです。 \sの逆。 ASCII フラグを使用した場合,.

    \w と同じになります。

    Unicode の単語文字にマッチします。これは、数字やアンダースコアだけでなく、どの言語でも単語の一部となり得るほとんどの文字を含みます。 ASCII フラグを使用すると、 にのみマッチします。

    8-bit (bytes) パターン。

    ASCII 文字セットで英数字とみなされる文字にマッチし, と等価である。 LOCALE フラグが指定されている場合、現在のロケールで英数字とみなされる文字とアンダースコアにマッチする。

    \W

    ワード文字以外の任意の文字にマッチする。 これは \w の逆である。 ASCII フラグが指定されている場合は、 と同じ意味になる。 LOCALE フラグが指定されている場合、現在のローカルの英数字でもアンダースコアでもない文字にマッチする。

    \Z

    文字列の末尾にのみマッチする。

    Python の文字列リテラルでサポートされている標準的なエスケープのほとんどは、正規表現パーサーでも受け入れられます:

    \a \b \f \n\N \r \t \u\U \v \x \

    (\bは単語の境界を表すために用いられ、文字クラスの内部でのみ “backspace” ということを意味します)

    '\u''\U' および '\N' エスケープシーケンス はユニコードパターンでのみ認識されます。 バイトパターンでは、これらはエラーとなります。 ASCIIlettersの未知のエスケープは将来の使用のために予約され、エラーとして扱われます。

    Octalエスケープは限定的な形で含まれています。 1桁目が0であるか,8桁が3つある場合,8進エスケープとみなされます。 それ以外の場合はグループ参照となります。

    Change in version 3.3: '\u''\U' のエスケープシーケンスが追加されました。

    version 3.8での変更点: '\'とASCII文字からなる未知のエスケープをエラーとするように変更しました。 '\N{name}' エスケープシーケンスが追加されました。 文字列リテラルと同様に、これは指定された Unicode 文字 (例: '\N{EM DASH}') に展開されます。

コメントを残す

メールアドレスが公開されることはありません。