Ctrl+F を押して、探している単語を入力してテキストを検索する方法に慣れているかもしれません。正規表現はさらに一歩進んで、検索するテキストのパターンを指定できます。この記事では、Python のパターン マッチングが正規表現でどのように機能するかを見ていきます。
Python の正規表現
正規表現 、 とも呼ばれている 正規表現 、テキストのパターンの説明です。テキストを特定のパターンと照合することでテキストの有無を検出したり、パターンを 1 つ以上のサブパターンに分割したりできます。たとえば、 d 正規表現の は数字文字、つまり 0 から 9 までの任意の 1 つの数字を表します。
Python で正規表現を使用して電話番号を確認する
次の正規表現が使用されています パイソン 3 つの数字、ハイフン、さらに 3 つの数字、別のハイフン、および 4 つの数字の文字列と一致します。
Any other string would not match the pattern. ddd-ddd-dddd>
正規表現はさらに洗練されたものになる可能性があります。たとえば、パターンの後に中括弧 ({3}) で 3 を追加することは、「このパターンに 3 回一致する」と言っているのと同じです。したがって、少し短い正規表現は次のようになります。
リンクリスト
d{3}-d{3}-d{4}> 正しい電話番号形式と一致します。
正規表現によるパターンマッチング
Regex オブジェクトの 検索() メソッドは、渡された文字列を検索して、正規表現に一致するものがないかどうかを調べます。 Match オブジェクトには、検索された文字列から実際に一致したテキストを返す group() メソッドがあります。こちらもご覧いただけます正規表現のチートシート詳細については。
例: import re を使用して正規表現モジュールをインポートします。 Regex オブジェクトを作成します。re.compile()関数。 (生の文字列を使用することを忘れないでください。) 検索する文字列を Regex オブジェクトの search() メソッドに渡します。これにより、Match オブジェクトが返されます。 Match オブジェクトの group() メソッドを呼び出して、実際に一致したテキストの文字列を返します。
Python3
# Python program to illustrate> # Matching regex objects> import> re> > # regex object> phoneNumRegex>=> re.>compile>(r>'ddd-ddd-dddd'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(>'Phone number found: '> +> mo.group())> |
>
>
出力:
Phone number found: 415-555-4242>
正規表現によるグループ化とキャプチャのためのかっこ
Regex を使用したパターン マッチングの方法の 1 つは、パターンを括弧で囲むことです。理解を深めるために、いくつかの異なる例を見てみましょう。
一致するオブジェクト
市外局番を電話番号の残りの部分から分離したいとします。かっこを追加すると、正規表現 (ddd)-(ddd-dddd) でグループが作成されます。次に、 group() match object メソッドを使用して、1 つのグループだけから一致するテキストを取得できます。
Python3
import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.group(>1>))> areaCode, number>=> mo.groups()> print>(>'area code:'>, areaCode)> print>(>'number:'>, number)> |
>
>
出力:
415 area code: 415 number: 555-4242>
すべてのグループを一度に取得する
すべてのグループを一度に取得したい場合は、groups(), メソッドを使用します。名前が複数形であることに注意してください。
Python3
import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.groups())> |
>
>
出力:
('415', '555-4242')> 括弧を一致させる
正規表現では括弧は特別な意味を持っていますが、テキスト内で括弧を照合する必要がある場合はどうすればよいでしょうか。たとえば、照合しようとしている電話番号の括弧内に市外局番が設定されている可能性があります。この場合、( および ) 文字をバックスラッシュでエスケープする必要があります。対話型シェルに次を入力します。
Python3
import> re> phoneNumRegex>=> re.>compile>(r>'((ddd)) (ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My phone number is (415) 555-4242.'>)> print>(mo.group(>1>))> |
デスクトップiniとは何ですか
>
>
出力:
(415)>
re.compile() に渡される生の文字列内の ( および ) エスケープ文字は、実際のかっこ文字と一致します。
正規表現: グループ化とパイプ文字
の | 文字はパイプと呼ばれます。多くの式の 1 つに一致させたい場所ならどこでも使用できます。
例: 正規表現 r'Batman|Tina Fey' は、「Batman」または「Tina Fey」のいずれかに一致します。 Batman と Tina Fey の両方が検索文字列内に出現する場合、最初に出現した一致するテキストが Match オブジェクトとして返されます。
Python3
# Python program to illustrate> # Matching regex objects> # with multiple Groups with the Pipe> import> re> heroRegex>=> re.>compile> (r>'Batman|Tina Fey'>)> mo1>=> heroRegex.search(>'Batman and Tina Fey.'>)> print>(mo1.group())> |
>
>
出力:
'Batman'>
正規表現の中括弧を理解する
特定の回数だけ繰り返したいグループがある場合は、正規表現内のグループの後に中括弧内の数字を続けます。
たとえば、正規表現 (Ha){3} は文字列「HaHaHa」に一致しますが、「HaHa」には一致しません。これは、後者には (Ha) グループの繰り返しが 2 つしかないためです。数値を 1 つだけ指定する代わりに、中括弧内の範囲を指定できます。正規表現 (Ha){3, 5} は、「HaHaHa」、「HaHaHaHa」、「HaHaHaHaHa」に一致します。中括弧内の最初または 2 番目の数値を省略して、最小値または最大値を無制限のままにすることもできます。 (Ha){3, } は (Ha) グループの 3 つ以上のインスタンスと一致し、(Ha){, 5} は 0 ~ 5 つのインスタンスと一致します。中括弧は正規表現を短くするのに役立ちます。
例 1: この例では、中括弧を使用して、探しているパターンの出現を指定します。
Python3
# Python program to illustrate> # Matching Specific Repetitions> # with Curly Brackets> import> re> haRegex>=> re.>compile>(r>'(Ha){3}'>)> mo1>=> haRegex.search(>'HaHaHa'>)> print>(mo1.group())> |
>
>
出力:
HaHaHa>
例 2: この例では、中括弧を使用してパターンの出現を定義し、その中に特定のパターンが存在するかどうかを検索します。
Python3
# Python program to illustrate> # Matching Specific Repetitions> # with Curly Brackets> import> re> haRegex>=> re.>compile>(r>'(Ha){3}'>)> mo2>=> haRegex.search(>'Ha'>)>=>=> None> print>(mo2)> |
>
>
CSVファイルをJavaから読み込む
出力:
True>
正規表現内のオプションの演算子または疑問符 (?)
場合によっては、オプションでのみ一致させたいパターンがあります。つまり、正規表現は、そのテキスト部分が存在するかどうかに関係なく、一致を見つける必要があります。の ? 文字は、パターンのオプションの部分として、その前にあるグループにフラグを立てます。
例 1: ここでは、「バットマン」または「バットウーマン」のパターンで検索します。の (どこ)? 正規表現の一部は、パターン wo がオプションのグループであることを意味します。正規表現は、wo のインスタンスが 0 つまたは 1 つ含まれるテキストと一致します。これが、正規表現が「Bat Woman」と「Batman」の両方に一致する理由です。考えられるのは?言うように、 groups この疑問符の前にあるグループの 0 つまたは 1 つと一致します。
実際の疑問符文字と一致させる必要がある場合は、? でエスケープします。
Python3
# Python program to illustrate> # optional matching> # with question mark(?)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)?man'>)> mo1>=> batRegex.search(>'The Adventures of Batman'>)> mo2>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo1.group())> print>(mo2.group())> |
>
>
出力:
Batman Batwoman>
星と一致する 0 個以上のパターン
* (スターまたはアスタリスクと呼ばれます) は、 0 個以上一致 — スターの前にあるグループはテキスト内で何度でも出現できます。完全に消失することもあれば、何度も繰り返されることもあります。実際のスター文字と一致させる必要がある場合は、正規表現内のスターの前にバックスラッシュ * を付けます。
例 1: この例では、文字列内で出現するパターンが 0 個と一致します。正規表現の (wo)* 部分は、文字列内の wo のゼロ インスタンスと一致します。
Python3
# Python program to illustrate> # matching a regular expression> # with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo1>=> batRegex.search(>'The Adventures of Batman'>)> print>(mo1.group())> |
>
>
出力:
Batman>
例 2: この例では、文字列内で少なくとも 1 回出現するパターンと一致します。
パイソン
#python program to illustrate> #matching a regular expression> #with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo2>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo2.group())> |
>
npmキャッシュをクリーンアップする
>
出力:
Batwoman>
例 3: この例では、文字列内のパターンの複数の出現と一致します。
パイソン
# Python program to illustrate> # matching a regular expression> # with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo3>=> batRegex.search(>'The Adventures of Batwowowowoman'>)> print>(mo3.group())> |
>
>
出力:
Batwowowowoman>
プラスを使用した 1 つ以上のパターン マッチング
その間 * 手段 0 個以上一致 、+ (またはプラス) は意味します。 1 つ以上一致します。 一致する文字列にグループが出現する必要がないスターとは異なり、プラスの前にあるグループは少なくとも 1 回出現する必要があります。オプションではありません。実際のプラス記号文字と一致させる必要がある場合は、プラス記号の前にバックスラッシュを付けてエスケープします (+)。
例 1: この例では、文字列内で少なくとも 1 回出現するパターンと一致します。
Python3
# Python program to illustrate> # matching a regular expression> # with plus(+)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)+man'>)> mo1>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo1.group())> |
>
>
出力:
Batwoman>
例 2: この例では、プラス記号には少なくとも 1 つの wo が必要であるため、正規表現 Bat(wo)+man は文字列「The Adventures of Batman」とは一致しません。
トップ 10 エロアニメ
パイソン
# Python program to illustrate> # matching a regular expression> # with plus(+)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)+man'>)> mo3>=> batRegex.search(>'The Adventures of Batman'>)>=>=> None> print>(mo3)> |
>
>
出力:
True>
関連記事 – 正規表現チートシート