クイックスタート
チュートリアル
ツール & 言語
リファレンス
書籍レビュー
正規表現ツール
grep
PowerGREP
RegexBuddy
RegexMagic
一般的なアプリケーション
EditPad Lite
EditPad Pro
言語とライブラリ
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery & XPath
XRegExp
データベース
MySQL
Oracle
PostgreSQL
このサイトのコンテンツ
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションとプログラミング言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書籍レビュー
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexBuddy—The best regex editor and tester for Python developers!

Pythonのreモジュール

Pythonは高水準のオープンソーススクリプト言語です。Pythonに組み込まれている「re」モジュールは、現代的で完全な正規表現のフレーバーを備えた、正規表現の優れたサポートを提供します。2つの重要な欠落機能であるアトミックグループ化所有限定子は、Python 3.11で追加されました。Pythonの正規表現エンジンはUnicode文字列を正しく処理しますが、その構文にはまだUnicodeプロパティ短縮文字クラスはASCII文字のみに一致します。

最初にすべきことは、次のコードでregexpモジュールをスクリプトにインポートすることです。import re.

正規表現の検索とマッチ

次の関数を呼び出します。re.search(regex, subject)正規表現パターンを対象文字列に適用します。この関数は次の値を返します。None一致の試行が失敗した場合、そうでない場合はMatchオブジェクトが返されます。なぜならNoneFalseと評価されるため、re.search()ifステートメントで簡単使用できます。このMatchオブジェクトは、正規表現パターンによって一致した文字列の部分に関する詳細を保存します。

次の関数の3番目のパラメーターとして特別な定数を指定することにより、正規表現のマッチングモードを設定できます。re.search(). re.Iまたはre.IGNORECASEは、パターンを大文字と小文字を区別せずに適用します。re.Sまたはre.DOTALLは、ドットを改行に一致させます。re.Mまたはre.MULTILINEは、対象文字列内の改行の後または前に、キャレットとドルを一致させます。シングルレターオプションと記述オプションの間には、入力する必要のある文字数を除いて違いはありません。複数のオプションを指定するには、|演算子でそれらを「or」で結合します。re.search("^a", "abc", re.I | re.M).

デフォルトでは、Pythonの正規表現エンジンは、文字AからZ、数字0から9、およびアンダースコアを「単語文字」と見なします。フラグを指定します。re.Lまたはre.LOCALEにすると\wは、現在のロケール設定で文字と見なされるすべての文字に一致します。または、次を指定できます。re.Uまたはre.UNICODEは、すべてのスクリプトのすべての文字を単語文字として扱います。設定は、単語境界にも影響します。

を混同しないでください。re.search()re.match()。両方の関数はまったく同じことを行いますが、重要な違いは、re.search()は一致が見つかるまで文字列全体でパターンを試行することです。re.match()一方、文字列の先頭でのみパターンを試行します。基本的に、re.match("regex", subject)re.search("\Aregex", subject)と同じです。注意してください。re.match()は、正規表現が文字列全体と一致する必要はありませんre.match("a", "ab")は成功します。

Python 3.4では、新しいre.fullmatch()関数が追加されました。この関数は、正規表現が文字列全体に一致する場合にのみMatchオブジェクトを返します。それ以外の場合はNone. re.fullmatch("regex", subject)re.search("\Aregex\Z", subject)を返します。これは、ユーザー入力を検証する場合に便利です。もしsubjectが空の文字列の場合、fullmatch()は、長さ0の一致を見つけることができる任意の正規表現に対してTrue

を返します。文字列からすべての一致を取得するには、を呼び出します。これにより、文字列内の重複しないすべての正規表現の一致の配列が返されます。「重複しない」とは、文字列が左から右に検索され、次のマッチ試行が前のマッチを超えて開始されることを意味します。正規表現に1つ以上のキャプチャグループが含まれている場合、re.findall()は、すべてのキャプチャグループによって一致したテキストを含む各タプルを含むタプルの配列を返します。正規表現全体をキャプチャグループ内に配置しない限り、正規表現全体の一致はタプルには含まれません。

よりも効率的なのはre.findall()re.finditer(regex, subject)です。これにより、対象文字列内の正規表現の一致をループ処理できるイテレーターが返されます。for m in re.finditer(regex, subject)。forループ変数mは、現在のマッチの詳細を含むMatchオブジェクトです。

とは異なりre.search()re.match(), re.findall()re.finditer()は、正規表現マッチングフラグを持つオプションの3番目のパラメーターをサポートしていません。代わりに、正規表現の先頭でグローバルモード修飾子を使用できます。たとえば、「(?i)regex」はregexを大文字と小文字を区別せずにマッチさせます。

文字列、バックスラッシュ、正規表現

バックスラッシュは、正規表現のメタ文字です。他のメタ文字をエスケープするために使用されます。正規表現\\は単一のバックスラッシュに一致します。\dは、数字に一致する単一のトークンです。

Python文字列もバックスラッシュを使用して文字をエスケープします。上記の正規表現は、Python文字列として次のように記述されます。"\\\\""\\d"。確かに紛らわしいです。

幸いなことに、Pythonにはバックスラッシュに特別な処理を適用しない「raw strings」もあります。raw stringsとして、上記の正規表現は次のようになります。r"\\"r"\d"。raw stringsを使用する場合の唯一の制限は、文字列に使用している区切り文字が正規表現に表示されないことです。raw stringsには、それをエスケープする手段がないためです。

raw stringsでは、\nと\tを使用できます。raw stringsはこれらのエスケープをサポートしていませんが、正規表現エンジンはサポートしています。最終的な結果は同じです。

Unicode

Python 3.3より前は、PythonのreモジュールはUnicode正規表現トークンをサポートしていませんでした。ただし、PythonのUnicode文字列は常に\uFFFF表記法をサポートしてきました。PythonのreモジュールはUnicode文字列を使用できます。そのため、Unicode文字列u"\u00E0\\d"をreモジュールに渡して、àの後に数字が続くものをマッチさせることができました。のバックスラッシュ\dはエスケープされ、のバックスラッシュは\uはエスケープされませんでした。なぜなら、\dは正規表現トークンであり、正規表現のバックスラッシュはエスケープする必要があるためです。\u00E0は、エスケープする必要のないPython文字列トークンです。文字列u"\u00E0\\d"は、正規表現エンジンによって次のようになります。à\d.

もし\uの前に別のバックスラッシュを置いた場合、正規表現エンジンは次のようになります。\u00E0\d。この正規表現をPython 3.2以前で使用すると、リテラルテキストu00E0の後に数字が続くものがマッチします。

バックスラッシュをエスケープする必要があるかどうかについての混乱を避けるために、次のようなUnicode raw stringsを使用してください。ur"\u00E0\d"。そうすれば、バックスラッシュをエスケープする必要はありません。Pythonは、raw stringsのUnicodeエスケープを解釈します。

Python 3.0以降では、文字列はデフォルトでUnicodeです。そのため、上記の例に示されているuプレフィックスは必要なくなりました。Python 3.3では、\uFFFF表記法も正規表現エンジンに追加されました。そのため、Python 3.3では、文字列"\\u00E0\\d"を使用して、正規表現\u00E0\dを渡すことができ、これはà0.

のようなものとマッチします。

re.sub(regex, replacement, subject)は、subject全体で検索と置換を実行し、subject内のregexのすべての一致をreplacementに置き換えます。結果はsub()関数によって返されます。渡す対象文字列は変更されません。

正規表現にキャプチャグループがある場合、キャプチャグループ内の正規表現の部分によって一致したテキストを使用できます。3番目のグループのテキストを置換するには、\3を置換文字列に挿入します。3番目のグループのテキストの後にリテラル3を置換として使用する場合は、\g<3>3. \33は、33番目のグループとして解釈されます。33未満のグループしかない場合はエラーです。名前付きキャプチャグループを使用した場合は、置換テキストで次のように使用できます。\g<name>.

re.sub()関数は、正規表現に適用されるのと同じバックスラッシュロジックを置換テキストに適用します。したがって、上記の例で行ったように、置換テキストにはraw stringsを使用する必要があります。また、re.sub()関数は、raw stringsで\nと\tも解釈します。もしc:\tempを置換として使用する場合は、r"c:\\temp"または"c:\\\\temp"のどちらかを使用してください。3番目の後方参照はr"\3"または"\\3".

です。

文字列の分割は、文字列の配列を返します。配列には、subject内のすべての正規表現の一致の間にあるsubjectの部分が含まれます。隣接する正規表現の一致は、配列に空の文字列を表示させます。正規表現の一致自体は配列に含まれません。正規表現にキャプチャグループが含まれている場合、キャプチャグループによって一致したテキストが配列に含まれます。キャプチャグループは、正規表現の一致の左側と右側に表示される部分文字列の間に挿入されます。配列にキャプチャグループを含めたくない場合は、非キャプチャグループに変換します。re.split()関数は、キャプチャグループを抑制するオプションを提供しません。

オプションの3番目のパラメータを指定して、対象文字列を分割する回数を制限できます。この制限は、配列に最終的に格納される文字列の数ではなく、分割回数を制御することに注意してください。分割されなかった対象文字列の残りの部分は、配列の最後の文字列として追加されます。キャプチャグループがない場合、配列にはlimit+1個のアイテムが含まれます。

正規表現が長さゼロのマッチを見つけた場合、re.split()の動作はPythonのバージョン間で変更されています。Python 3.4以前では、re.split()長さゼロのマッチを無視します。Python 3.5および3.6では、re.split()長さゼロのマッチに遭遇するとFutureWarningをスローします。この警告は、Python 3.7での変更を示しています。現在ではre.split()長さゼロのマッチでも分割されます。

マッチの詳細

re.search()re.match()はMatchオブジェクトを返しますが、re.finditer()はMatchオブジェクトを反復処理するイテレータを生成します。このオブジェクトは、正規表現のマッチに関する多くの有用な情報を保持しています。以下ではmをMatchオブジェクトを示すために使用します。

m.group()は、正規表現全体によってマッチした文字列の一部を返します。m.start()は、マッチの開始位置の文字列内でのオフセットを返します。m.end()は、マッチの範囲を超える文字のオフセットを返します。m.span()は、m.start()m.end()m.start()の2タプルを返します。このを使用して、対象文字列をスライスできます。.

subject[m.start():m.end()]全体の正規表現のマッチではなく、キャプチャグループの結果が必要な場合は、グループの名前または番号をパラメータとして指定します。m.group(3)は、3番目のキャプチャグループによってマッチしたテキストを返します。m.group('groupname')は、名前付きグループ 'groupname'によってマッチしたテキストを返します。グループが全体的なマッチに参加しなかった場合、m.group()m.start()は空の文字列を返し、

は-1を返します。re.sub()を使用せずに、正規表現ベースの検索と置換を行いたい場合は、m.expand(replacement)を呼び出して、置換テキストを計算します。この関数は、後方参照などが置換された置換文字列を返します。

正規表現オブジェクト

同じ正規表現を複数回使用する場合は、正規表現オブジェクトにコンパイルする必要があります。正規表現オブジェクトはより効率的で、コードをより読みやすくします。作成するには、re.compile(regex)またはまたはre.compile(regex, flags)re.search()re.match()を呼び出すだけです。フラグは、上記の

関数のマッチングオプションです。によって返される正規表現オブジェクトre.compile()は、reモジュールが直接提供するすべての機能も提供します。, search(), match(), findall(), sub()finditer()split()などです。違いは、正規表現オブジェクトに格納されたパターンを使用し、正規表現を最初のパラメータとして受け取らないことです。re.compile(regex).search(subject).

re.search(regex, subject)

と同等です。| クイックスタート | チュートリアル | ツールと言語 |  | リファレンス | 書籍レビュー |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery & XPath | XRegExp |