Pythonのreモジュールで正規表現によるパターンマッチングを行う方法
はじめに
RegExモジュールとは、正規表現(Regular Expression)を扱うためのPython標準ライブラリです。プログラミングの経験がある方なら、「正規表現」という言葉を目にしたことが何度もあるでしょう。正規表現は文字列の検索や置換に使われ、テキストエディタ、検索エンジン、ワープロソフトなど、さまざまなソフトウェアで活用されています。
言い換えれば、正規表現は「探している特定のパターンに一致するかどうか」を判定するための強力な道具です。
身近な例としては、大学のポータルサイトが学内メールアドレス以外での登録を許可しない仕組みが挙げられます。これも正規表現によるパターンマッチングで実現されています。
はじめ方
正規表現モジュール(re)はPythonに最初から同梱されているため、別途ダウンロードやインストールは不要です。
モジュールの機能を使い始めるには、まずインポートします。インポートは次の1行だけです。
import re
主な関数の一覧
reモジュールには多数の関数が用意されており、それぞれの役割の違いを理解しておくことが重要です。以下は、Pythonプロジェクトで特によく使われる主要関数の一覧です。
re.compile(pattern, flags) # パターンをコンパイルして再利用可能なオブジェクトを作成 re.search(pattern, string, flags) # 文字列全体を走査し、最初に一致した箇所を返す re.match(pattern, string, flags) # 文字列の先頭がパターンと一致するか判定 re.split(pattern, string, max, flag)# パターンに基づいて文字列を分割 re.findall(pattern, string, flag) # パターンに一致したすべての箇所をリストで返す re.finditer(pattern, string, flags) # 一致箇所をイテレータとして返す re.sub(pattern, repl, string, count) # パターンに一致した部分を置換 re.subn(pattern, repl, string, count) # re.subと同様だが、(結果の文字列, 置換回数)のタプルを返す re.escape(pattern) # ASCII文字以外の特殊文字をすべてエスケープ
re.compile関数とre.match関数
まず、文字列「Hello world」が、別の文字列「Hello world! How are things going?」の中に存在するかどうかを調べてみましょう。これには re.compile と re.match を組み合わせて使います。
x = re.compile("Hello world")
y = x.match("Hello world! How are things going?")
if y:
print("Strings match")
else:
print("Strings do not match")実行結果
Strings match
「compile関数を使わずにできないのか?」と思った方は正しいです。実際、compileを省略しても同じ処理が書けます。
y = re.match("Hello world", "Hello world! How are things going?")
if y:
print("Strings match")
else:
print("Strings do not match")実行結果
Strings match
補足として、re.matchは文字列の先頭とのみ一致を判定するのに対し、re.searchは文字列全体から一致箇所を探すという違いがあります。用途に応じて使い分けましょう。
re.split関数
x = re.split("\W+", "Hello,World")
print(x)
x = re.split("(\W+)", "Hello,World")
print(x)実行結果
['Hello', 'World'] ['Hello', ',', 'World']
上の例では、「\W+」は「英数字・アンダースコア以外の文字(ここではカンマ)」で分割することを意味します。2つ目の例のようにパターンを括弧 () で囲むと、区切りに使った文字(カンマなど)も結果のリストに含まれる点に注意してください。
re.sub関数とre.subn関数
x = re.sub(r"there", "World", "Hello there. Python is fun.") print(x) x = re.subn(r"there", "World", "Hello there. Python is fun. Hello there") print(x)
実行結果
Hello World. Python is fun.
('Hello World. Python is fun. Hello World', 2)この例では、re.subが文字列中の「there」を探して「World」に置換しています。
subn関数はsubとまったく同じ置換を行いますが、戻り値が文字列ではなくタプルであり、置換が何回行われたかという回数も一緒に返してくれる点が異なります。
実践例:パスワードのバリデーション
RegExモジュールの実用的な活用例のひとつが、パスワードの妥当性チェックです。以下のプログラムは、「7文字以上で、かつ数字を1つ以上含む」ことを条件にパスワードを検証します。
import re
matching_sequence = r"[0-9]"
while True:
password = input("パスワードを入力してください : ")
result = re.search(matching_sequence, password)
if result and len(password) > 6:
print(password + " は有効なパスワードです")
else:
print(password + " は無効なパスワードです。7文字以上で、数字を1つ以上含めてください")
input("Enterキーを押して終了 ")このプログラムは、入力されたパスワードが条件(7文字以上かつ数字を1つ以上含む)を満たしているかどうかを判定します。
まとめ
本記事では、Pythonのre(RegEx)モジュールの基礎と、モジュール内に用意されているさまざまな関数について学びました。
reモジュールには他にも多くの関数や高度な使い方があります。さらに詳しく知りたい方は、公式ドキュメント(https://docs.python.org/3/library/re.html)を参照してください。
-
PythonとMatplotlibで折れ線グラフの終端に注釈(ラベル)を付ける方法
PythonとMatplotlibを使えば、折れ線グラフの各線の終端に直接ラベル(注釈)を表示できます。これにより、凡例を目で追わなくても、どの線が何を表しているのか一目でわかる、読みやすいグラフを作成できます。 実装の手順 図のサイズを設定し、サブプロット間および周囲の余白を調整します。 データの行数を指定する変数 rows を初期化します。 Pandasのデータフレーム(長方形の表形式データ)を作成します。 データフレームの累積和(cumsum)を計算します。 plot()メソッドでデータフレームをプロットします。 各line(線オブジェクト)とname(列名)を反復処理し、線の終端に注
-
PythonのopenpyxlでExcelファイルを読み書きする方法を徹底解説
はじめにopenpyxlは、Excel 2010形式のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。Office Open XML形式をPythonからネイティブに扱えるライブラリが存在しなかったことから、その不足を補うために誕生しました。業務などで使用するExcelファイルは「ワークブック(Workbook)」と呼ばれ、最低1枚、最大で数十枚のシートを含むことができます。各シートは、行が1から始まり、列がAから始まる構成になっています。openpyxlライブラリを使えば、シートの追加やデータの入力はもちろん、データの操作や削除まで、さまざま