Python で Re モジュールを使用した正規表現ワイルドカード

Jay Shaw 2023年10月10日
  1. Python でワイルドカードを使用した正規表現操作に re.sub() 関数を使用する
  2. Python で re.sub() モジュールを使用して正規表現の一致を置換する
  3. re.sub() サブモジュールでワイルドカードを使用する方法を理解する
  4. Python で 2つ以上の正規表現ワイルドカードを一緒に使用する
  5. Python でワイルドカードを追加して、正規表現パターンと re.sub() 関数を使用して文字列に対して操作を実行する
  6. まとめ
Python で Re モジュールを使用した正規表現ワイルドカード

ワイルドカードは、1つまたは複数の文字を表したり入れ替えたりするための記号として、正規表現で使用されます。 これらは主に、検索条件を簡素化するために使用されます。

この記事では、Python でワイルドカードを指定して re.sub() を使用して、文字列を正規表現と照合する方法について詳しく説明します。

Python でワイルドカードを使用した正規表現操作に re.sub() 関数を使用する

Python の re モジュールは、正規表現 (RegEx) の操作に使用されます。 これらは、文字列または文字列のグループを検索するために使用される一意の文字列です。

テキストを特定のパターンと比較すると、存在するか存在しないかを判断できます。

パターンを 1つ以上のサブパターンに分割することもできます。 正規表現のサポートは、Python で re モジュールを介して利用できます。

その主な目的は、正規表現内の文字列を検索することです。

Python でワイルドカードを使用して re.sub() を使用する方法を理解する前に、通常の文字列ステートメントでの re.sub() 関数の実装について学びましょう。

Python で re.sub() モジュールを使用して正規表現の一致を置換する

re.sub() 関数は、指定されたテキスト内の 1つ以上の一致を文字列に置き換えます。

re.sub(pattern, repl, string, count=0, flags=0)

文字列内のパターンの左端の重複しないオカレンスを置換 repl に置き換えることによって作成された文字列を返します。

一致しない場合、文字列は元の形式で返されます。 repl が文字列の場合、バックスラッシュのエスケープが処理されます。 repl も関数にすることができます。

以下のコード例を理解しましょう。

import re

rex = "[0-9]+"
string_reg = "ID - 54321, Pay - 586.32"
repl = "NN"

print("Original string")
print(string_reg)

result = re.sub(rex, repl, string_reg)

print("After replacement")
print(result)

コードの機能:

  1. コードの最初の行は re モジュールをインポートします。
  2. 検索するパターンは、変数 rex 内に格納されます。 量指定子 - [0-9]+ は、0 から 9 の範囲の数字のグループを意味し、その小数点以下の桁数は任意の桁数に拡張できます。
  3. サブオペレーションが実装される文字列は、変数 string_reg 内に保存されます。
  4. パターンを置き換える文字列は、変数 repl に格納されます。
  5. re.sub() 操作は、文字列変数 string_reg 内のパターン rex を検索し、それを repl に置き換えます。 返された文字列は、変数 result に格納されます。
result = re.sub(rex, repl, string_reg)

出力: すべての数字は 'NN' に置き換えられますが、アルファベットはそのまま残ります。

Original string
ID - 54321, Pay - 586.32
After replacement
ID - NN, Pay - NN.NN

re.sub() サブモジュールでワイルドカードを使用する方法を理解する

この記事では、主に 4 種類のワイルドカード (.) に焦点を当てています。 (ドット)、*?、および +。 Python でワイルドカードを使用して re.sub() を使用する方法を学ぶには、それぞれが何をするかを学ぶことが重要です。

  1. . (ドット) - .re.sub を使用します。 改行以外の任意の文字に一致する Python のワイルドカード。 re モジュールは以下のプログラムにインポートされ、3つの文字列インスタンスが文字列変数 string_reg 内に保存されます。

    .re.sub() を使用する Python のワイルドカードでは、string_reg 変数は re.sub() 関数から返された結果で上書きされます。 ドットが新しい文字に一致すると、プログラムはパターン adad の後に繰り返される任意の数の d を検索します。

    出力では、プログラムがパターン ad. を見つけるたびに、それを REMOVED に置き換えることがわかります。

    import re
    
    string_reg = "a23kaddhh234 ... add2asdf675 ... xxxadd2axxx"
    
    string_reg = re.sub(r"ad.", "REMOVED ", string_reg)
    print(string_reg)
    

    出力:

    a23kREMOVED hh234 ... REMOVED 2asdf675 ... xxxREMOVED 2axxx
    
  2. アスタリスク (*) - Python でこのワイルドカードと共に re.sub() を使用して、前の RE にできるだけ多くの繰り返しを与え、結果の RE でこれらの繰り返しの 0 回以上に一致させます。

    たとえば、ad* は、任意の数の d が後に続く文字 'a''ad'、または 'a' に一致します。

    ここの出力では、'a''ad' のすべてのインスタンスがキーワード 'PATCH' に置き換えられていることがわかります。

    import re
    
    string_reg = "a23kaddhh234 ... add2asdf675 ... xxxadd2axxx"
    
    string_reg = re.sub(r"ad*", "PATCH", string_reg)
    print(string_reg)
    

    出力:

    PATCH23kPATCHhh234 ... PATCH2PATCHsdf675 ... xxxPATCH2PATCHxxx
    
  3. + - Python でこのワイルドカードと共に re.sub() を使用して、新しい RE 内の前の RE の 1 回以上の繰り返しに一致させます。 Ad+'a' と一致しません。 代わりに、'a' の後にゼロ以外の数値の d が続くものに一致します。

    この関数は、パターン 'ad....' を検索します。ここで、'...' は、後続の RE 'd' の繰り返し数を表し、'POP' に置き換えます。

    import re
    
    string_reg = "a23kaddhh234 ... add2asdf675 ... xxxadd2axxx"
    
    string_reg = re.sub(r"ad+", "POP", string_reg)
    print(string_reg)
    

    出力:

    a23kPOPhh234 ... POP2asdf675 ... xxxPOP2axxx
    
  4. ? - 次の RE を前の RE の 0 回または 1 回の繰り返しと一致させます。 パターン ad? 'a' または 'ad' のいずれかに一致します。

    プログラムは 'a' または 'ad' のインスタンスを見つけ、それらを正規表現 (REGEX) 'POP' に置き換えます。

    import re
    
    string_reg = "a23kaddhh234 ... add2asdf675 ... xxxadd2axxx"
    
    string_reg = re.sub(r"ad?", "POP", string_reg)
    print(string_reg)
    

    出力:

    POP23kPOPdhh234 ... POPd2POPsdf675 ... xxxPOPd2POPxxx
    

Python で 2つ以上の正規表現ワイルドカードを一緒に使用する

re.sub() をワイルドカードとともに Python で使用し、量指定子を 1つだけ使用しても、目的の結果を得るには不十分な場合があります。 量指定子を組み合わせると、より複雑なパターンをシステムに渡すことができます。

それらのいくつかを理解しましょう。

  1. *?, +?, ?? - 前の例では、’.’、’+’、’*’ 量指定子について学びました。 それらはすべて貪欲であり、可能な限り多くのテキストに一致することを意味します。

    たとえば、RE<.*><a> b <c> と一致する場合、<a> だけでなく完全な文字列と一致しますが、これは多くの場合、望ましい動作ではありません。

    ? 問題を解決するために量指定子が最後に追加されます。 量指定子は、一致する文字が最も少ないことを意味する、最小限の方法または貪欲でない方法で一致を行うように指示します。

    RE<.*?> パターンが使用されている場合、<a> のみが一致します。

    import re
    
    string_reg = "as56ad5 ... dhgasd55df ... xxxadd2axxx"
    
    string_reg = re.sub(r"ad*?", "SUGAR", string_reg)
    print(string_reg)
    

    出力: ad*? 量指定子は、'a' のみのインスタンスを検索します。

    SUGARs56SUGARd5 ... dhgSUGARsd55df ... xxxSUGARdd2SUGARxxx
    

    ad+? の場合: 'ad' だけのインスタンスを検索します。

    as56SUGAR5 ... dhgasd55df ... xxxSUGARd2axxx
    

    ad?? の場合: 'a' のみのインスタンスも検索します。

    SUGARs56SUGARd5 ... dhgSUGARsd55df ... xxxSUGARdd2SUGARxxx
    
  2. *+++?+ (所有量指定子としても知られています) - '*''+'、および '?' 量指定子と同様に、 '+' は可能な限り頻繁に一致します。

    後の式が一致しない場合、貪欲な量指定子が行うように、これらはバックトラックを許可しません。 このタイプの量指定子は、所有量指定子として知られています。

    たとえば、a*a"aaaa" と一致します。これは、a* が 4つの a のすべてに一致するためですが、最後の "a" に遭遇すると、式はバックトラックし、a* のみが一致します。 合計 3つの a と最後の "a" が 4 番目の "a" に一致します。

    ただし、a*+a という表現を使用して "aaaa" に一致させる場合、a*+ は 4つの "a" のすべてに一致しますが、バックトラックすることはできず、最後の には一致しません。 "a" は、一致する文字がこれ以上見つからないためです。

    x*+x++x?+ に相当するものは、それぞれ (?>x*)(?>x+)(?>x?) です。 概念をよりよく理解するために、プログラムを見てみましょう。

    import regex
    
    string_reg = "as56ad5 ... dhgasd55df ... xxxadd2axxx"
    
    string_reg = regex.sub(r"ad*+", "SUGAR", string_reg)
    print(string_reg)
    

    注意: re モジュールは所有量指定子をサポートしていません。 代わりに regex() モジュールを使用してください。

    出力: a または 'adddd....' のインスタンスを検索します。

    SUGARs56SUGAR5 ... dhgSUGARsd55df ... xxxSUGAR2SUGARxxx
    

    ad++ の場合: 'ad' または 'adddd....' のインスタンスを検索します。

    as56SUGAR5 ... dhgasd55df ... xxxSUGAR2axxx
    

    ad+? の場合: ad++ と同じように動作します。

    as56SUGAR5 ... dhgasd55df ... xxxSUGARd2axxx
    

Python でワイルドカードを追加して、正規表現パターンと re.sub() 関数を使用して文字列に対して操作を実行する

Python でワイルドカードを使用して re.sub() を使用する方法を学びました。 ここで、概念を一緒に使用して正規表現で文字列パターンを検索し、文字列パターンだけでなく単語全体を置き換えます。

問題文は、文字列とパターンを示しています。 パターンは、指定された文字列内で検索する必要があります。

見つかったら、re.sub() 関数が単語全体を置き換えます。

例: パターンが先頭にある場合に単語全体を置換する

  1. re モジュールをインポートします。

  2. 変数 string_reg を作成し、任意の文字列値を保存します。 ここでは、複合文字列が格納されています。つまり、re.sub() 関数は、文字列内の 4つのグループすべてにその効果を実装します。

    string_reg = """\
        23khadddddh234 > REMOVED23khh234
        add2asdf675 > REMOVED2asdf675"""
    
  3. 関数は文字列内のパターンを見つける必要があり、見つかったときに文字列全体を置き換えます。 検索するパターンは 'add' であるため、目的の結果を得るために量指定子の組み合わせが使用されます。

    組み合わせは、'ad''add'、または 'addddd' と一致する必要があります。 ただし、add23khh234add2asdf675 も一致しないはずです。

    これを行う最善の方法は、add.+? を使用することです。

    string_reg = re.sub(r"add.+? ", "REMOVED ", string_reg)
    

コード:

import re

string_reg = """\
... 23khadddddh234 > REMOVED23khh234
... add2asdf675 > REMOVED2asdf675"""

string_reg = re.sub(r"add.+? ", "REMOVED ", string_reg)
print(string_reg)

出力: プログラムは 'ad...' を検索し、見つかった場合は repl 'REMOVED' に置き換えます。 'ad...' が先頭にある場合は、単語全体が置き換えられます。

... 23khREMOVED > REMOVED23khh234
... REMOVED > REMOVED2asdf675

まとめ

Python でワイルドカードを使用して re.sub() を使用する方法の鮮明な説明が表示されます。 この記事の最初のセクションでは、単純な REGEX で Python 関数 re.sub を使用することに焦点を当てています。

次に、re.sub() でワイルドカードを使用する概念について詳しく説明します。

この記事を読み終えた読者は、Python でワイルドカードを使用して re.sub() を簡単に使用し、REGEX で文字列パターンを検索するプログラムを作成できます。

関連記事 - Python Regex