Pythonの正規表現とは何か?Reモジュールや代表例を解説

Pythonでプログラミングを学びたい方もいるでしょう。そこで重要なのが「正規表現」です。こちらを活用すれば、設定パターンに応じて、特定の文字列を探し出せます。これによりプログラミング作業の効率化が可能なので、是非方法を覚えましょう。今回はPython初心者のために、正規表現の定義や方法をまとめました。この記事を読んで、プログラミングの学習や仕事に活かしてみましょう。

 Pythonの正規表現とは?

Pythonの正規表現とは、文字の組み合わせを見つけるパターンです。正規表現ができれば、特定の文字列パターンを短時間で見つけ出せます。プログラミングでは複雑な文字列が多く、文字を見にくく感じる方もいるでしょう。しかし正規表現を使えば、そうした問題を解決できます。

正規表現はプログラミングにおいて、さまざまなデータ処理に使われます。たとえば文字列の置換やパターンマッチングで、対象箇所を探すために有用です。ほかにもデータのバリデーションやテキスト解析にも役立ちます。このように正規表現は、プログラミング作業の効率化で重要といえます。ビジネスで有能な人材になるためにも、是非、正規表現をものにしましょう。

Pythonの正規表現の記法を紹介

ここでは正規表現の記法について解説します。メタ文字と特殊シーケンスの2パターンがあるので、それぞれ参考にしましょう。

メタ文字

正規表現ではいくつかの「メタ文字」を使います。これはプログラミング用の特別な文字で、それぞれ意味合いがあるのです。メタ文字について、以下の代表例を参考にしてください。

メタ文字マッチ対象抽出文字列
.改行以外の任意文字a.cabc, aac, acc, alc…
^文字列の先頭^ababc, abd, ab1…
$文字列の末尾yz$xyz, yyz, 1yz…
*直前の正規表現に対し、0回以上繰り返したものab*a, ab, abb, abbb…
+直前の正規表現に対し、1回以上繰り返したものab+ab, abb, abbb…
?直前の正規表現に対し、0回か1回繰り返したものab?a, ab
[]文字集合指定。カッコ内のうちいずれか一文字[amk][x-z]a, m, kx, y, z
A | BAとBのいずれかa|ba, b
()グループの開始と終了という意味。丸括弧内の正規表現(xyz)+xyz, xyzab

特殊シーケンス

正規表現には特殊シーケンスもあり、以下が代表例です。

特殊シーケンスマッチ対象表示方法
\d数字[0-9]
\D数字以外[^0-9]
\s空白文字[\t\n\r\f\v]
\S空白文字以外[^\t\n\r\f\v]
\w英数字[a-xA-Z0-9_]
\W英数字以外[^a-xA-Z0-9_]

厳密には特殊シーケンスの場合、最初に「\」を入力してエスケープを行い、半角逆スラッシュのような文字を出します。たとえば「\w」なら「w」の前の「\」をエスケープして、半角逆スラッシュのような文字に変えるのです。以上で特殊シーケンスが完成します。

Pythonの正規表現の実装にはreモジュールを要する

Pythonで正規表現を実装するなら、reモジュールが必要です。reモジュールでは文字列の検索や置換、分割、連結などが実装されています。reモジュールの実装時は「import re」を入力してください。以下は関連の関数やメソッドの代表例です。

関数処理返り値
match先頭で一致する文字列を検索対象のマッチオブジェクト
search一致する文字列を検索対象のマッチオブジェクト
findall一致するすべての文字列を検索対象の文字列リスト
finditer一致するすべての文字列を検索対象の全マッチオブジェクト
fullmatch完全一致する文字列を検索対象のマッチオブジェクト
sub一致の文字列を置換置換後の文字列

検索の場合、一致対象がないと「None」と表示されたり、リストが空になったりします。以上を踏まえ、ケース別のreモジュールの方法を見ていきましょう。

match

match関数は「re.match(pattern, string, flags=0)」とします。任意文字列の先頭に対し、ユーザーが抽出したいワードの有無を判定する形です。

search

文字列全体を対象に、正規表現パターンにマッチさせるなら、search関数を使いましょう。「re.search(pattern, string, flags=0)」と入力します。これにより、任意文字列を対象に抽出ワードの有無を判定します。

findall

こちらは文字列全体で、複数の正規表現パターンをマッチさせるために使います。文字列は「re.findall(pattern, string, flags=0)」としてください。メールアドレスや電話番号など、特定文字列のリストアップに役立ちます。

finditer

「re.findall(pattern, string, flags=0)」と入力します。findallはリストとして返り値が出るのに対し、finditerはマッチオブジェクトが返るしくみです。後者は開始と終了の各位置を取得できるため、柔軟に活用できるでしょう。

fullmatch

「re.fullmatch(pattern, string, flags=0)」という文字列です。任意文字列全体が検索対象で、正規表現パターンとの完全一致があれば、対応のマッチオブジェクトが返ってきます。

sub

「re.sub(pattern, repl, string, count=0, flags=0)」という文字列です。検索に限らず置換もできるので、入力ミスや内容変更への対処に役立ちます。正規表現パターンに一致する箇所があれば、対処すべてを任意の文字列に置き換えたうえで、結果を出すしくみです。

Pythonの正規表現の代表例

reモジュール実装後は、正規表現に慣れていきましょう。ここではcompileやgroup(x)など、ケース別の正規表現の方法を紹介します。

まずはcompileを覚えよう

compileは以下の方法が推奨されます。

こちらの方が処理も速く、複用もできるため、柔軟に活用できます。compileは正規表現の基本なので、プログラミングに欠かせません。

group(x)

group(x)はターゲット文字の取得に使います。

ポイントは「r’hellow python, 123,end’」のように、contentの文字列では対象の先頭に「r」をつけることです。以上により、バックスラッシュがわかりやすくなります。groupの後のカッコ内は空白なら全文字、数字なら数字のみを検索対象にできます。

「.*」と「.*?」の区別

「.*」と「.*?」の区別は、マッチさせたい文字に応じて行いましょう。「.*」なら可能な限り多い文字、「.*?」は少ない文字へのマッチを狙います。普段使いやすいのは「.*?」です。

改行

改行するなら、matchで引数を決めてください。加えて「# re.S」も設定しましょう。以上により「.*」が改行を識別します。

search()

searchは存在するだけで結果を出せるので、柔軟に活用できます。matchは先頭から正確に一致していなければなりませんが、searchはそのようなことを求められません。

 findall()

findall()は全結果をリスト型にできます。search()は最初の結果を返すだけなので、findall()の方が多くの情報量を引き出せるでしょう。

以下は結果の例です。

replaceはsub()で可能

replaceはsub()を使えば、余分な情報を取り除きつつ、正規式を簡単に示せます。

正規表現を行う際の注意点

Pythonで正規表現をするには、さまざまな注意点があります。パターン文字列の定義では、クォーテーションの直前に「r」をつけましょう。またプログラミングでは英数字や記号だけでなく、日本語も扱えます。ここでは2つの注意点を確かめていきます。

パターン文字列の定義では「r」が重要

パターン文字列の定義では「r」が欠かせません。「r」をクォーテーションの前につけると、エスケープシーケンスを無効にできます。正規表現にはバックスラッシュ使用パターンがあるため、作業の効率化のために「r」が必要です。こちらがあれば、あらゆる正規表現がraw文字列として扱われます。たとえば「regex = r’ab*’」という文字列です。このように「r」を忘れなければ、ユーザーの狙いどおりに、パターン文字列を定義できます。

一方「r」をつけなくても、文字列が同じ結果の場合もあります。たとえば特殊シーケンスはエスケープシーケンスとは異なるため、クォーテーションの前に「r」をつけなくても影響が出ません。以上の例外はありますが、基本的にパターン文字列を定義するなら、クォーテーション直前の「r」を習慣づけてください。

日本語も正規表現に使える

Pythonの正規表現では日本語も利用可能です。多くの方はプログラミングでは、英数字や記号しか使わないとイメージするでしょう。確かに実際のプログラミングにおいて、日本語は英数字や記号より使用頻度が少ないといえます。しかし場合によっては、日本語の使用によるコードの成立もあるのです

たとえば「regex = u’[ぁ-ん]’」という具合です。正規表現で日本語を使うなら、表現パターンをUnicodeに変換しましょう。Python 3.3からは「u’…’」で変換可能で、エラーは生じません。ひらがなやカタカナだけでなく、漢字を使ったパターンも使用可能です。プログラミングでは、日本語を使った正規表現も可能と覚えてください。

まとめ

Pythonでプログラミングを学ぶなら、正規表現を覚えましょう。さまざまなパターンがあり、ひとつずつ覚えていけば、Webサイトやシステムの構築に役立ちます。正規表現によっては、プログラミングの効率化もできるでしょう。たとえば「.*?」は「.*」より少ない文字をマッチするため、正確な検索結果を引き出せるでしょう。

プログラミングを仕事に活かすうえで、正規表現は基本です。今回の記事を参考にしながらマスターしていきましょう。

最新情報をチェックしよう!