Pythonで正規表現を使ってみよう!

Pythonで正規表現を使ってみよう!
公開
Pythonで正規表現を実装するのは難しくない!文字列からe-mailや電話番号の検索、抽出、置換が容易にできます。正規表現パターンを作成するための、メタ文字や特殊シーケンス、特殊文字のエスケープの仕方、実装するために必要なreモジュール、このモジュールに含まれる関数を紹介します。

様々なプログラミング言語において、正規表現が活用されています。正規表現とは何でしょうか?Pythonにおいて、正規表現を実装するため、どんなモジュール・関数が必要でしょうか?実際に、正規表現を使って、文字列から携帯番号を抽出するサンプルコードを解説します。
Pythonで正規表現を使ってみましょう!

正規表現って何?

正規表現とは、文字列内で文字の組み合わせを照合するために用いられるパターンです。英語では、“regular expressions”(REs や regexes または regex patterns)と呼ばれています。正規表現を使うと、文字列の中から、特定のパターン文字列(e-mailアドレス、電話番号など)を検索し、抽出することができます。正規表現は、メタ文字と特殊シーケンス、また特殊記号自身を表すためにエスケープが用いられます。

正規表現のメタ文字

正規表現は、いくつかの特別な文字“メタ文字”によって表現されます。メタ文字は、それぞれ意味合いが付与されています。例えば、「$」には、文字列の末尾という意味合いがあります。

文字列“Enjoy your adventure, find more about Japan”において、正規表現パターン「re$」を指定した場合、文字列“adventure”と“more”が抽出されます。

使用頻度の高いメタ文字を列挙します。

メタ文字 マッチする文字列 抽出文字列
. 改行以外の任意の文字にマッチ a.c abc, aac, acc, a1c …
^ 文字列の先頭にマッチ ^ab abc, abd, ab1 …
$ 文字列の末尾にマッチ yz$ xyz, yyz, 1yz …
* 直前の正規表現を 0 回以上繰り返したものにマッチ ab* a, ab, abb, abbb …
+ 直前の正規表現を 1 回以上繰り返したものにマッチ ab+ ab, abb, abbb …
? 直前の正規表現を 0 回か 1 回繰り返したものにマッチ ab? a, ab
{m} 直前の正規表現をちょうど m 回繰り返したものにマッチ a{3} aaa
{m,n} 直前の正規表現を m 回から n 回、できるだけ多く繰り返したものにマッチ a{2,4} aa, aaa, aaa
[ ] 文字の集合を指定する。カッコ内に指定した文字のうち、いずれかの一文字 [amk]
[x-z]
a, m, k
x, y, z
A|B A|B は A と B のいずれかにマッチ a|b a, 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_]

また、メタ文字と特殊シーケンスなど、特殊文字自体を表現する場合、「¥」でエスケープします。例えば、「.」(ピリオド)を表現する時は、「¥.」と表記しエスケープします。これで、ピリオドを意味します。
その他の特殊文字も、同じ方法でエスケープできます。

正規表現を使った電話番号抽出の例

では具体例として、電話番号を抽出する正規表現を作ってみましょう。

この正規表現を用いて、携帯番号、つまり「0〜9までの数字3桁で始まり、ハイフン(“―“)の後に同じく0から9までの数字4桁、さらにハイフン(“―“)の後に同じく0から9までの数字4桁で終わる文字列」を抽出することができます。

各要素を分解すると、次の意味合いになります。

^[0-9]{3} : 先頭文字として数字3桁で始まる
―:ハイフン
[0-9]{4}:数字4桁
―:ハイフン
[0-9]{4}$:末尾文字として数字4桁で終わる

この正規表現で、文字列から携帯番号を抽出できます!

正規表現を実装するには、reモジュールが必要!

Pythonでは、reモジュールをインポートする事によって、正規表現を実装できます。このモジュールには、文字列の検索、置換、連結、分割など、文字列を扱う上で役立つメソッドが実装されており、正規表現にマッチした文字列、またマッチした情報をオブジェクトとして返します。詳しくは、モジュールコンテンツ(https://docs.python.org/ja/3/library/re.html#module-re)を参照してください。本章では、Pythonで実装するためのモジュールと、各関数(match関数、search関数、findall関数)の解説を行います。

では、reモジュールをインポートしてみましょう。

import re

簡単ですね。
では、このモジュールに含まれる主な関数やメソッドを見ていきます。

正規表現関連の文字列抽出関数

スライスという機能を使うとリストの一部を取得することができます。

(1)match関数:re.match(pattern, string, flags=0)

任意文字列の“先頭”で正規表現パターンにマッチした場合、対応するマッチオブジェクトを返します。文字列が、正規表現パターンにマッチしない場合、Noneを返します。

この関数は、任意文字列の“先頭”に抽出ワードがあるかどうかを判定します。
文字列全体で、正規表現パターンにマッチさせたい場合は、次のsearch関数を使用します。

(2)search関数:re.search(pattern, string, flags=0)

任意文字列全体を走査し、正規表現パターンがマッチする最初の場所を探し、対応する マッチオブジェクト を返します。正規表現パターンがマッチしない場合、None を返します。

この関数は、任意文字列中に、抽出ワードがあるかどうかを判定します。文字列全体で、正規表現パターンを“複数”マッチさせたい場合は、次のfindall関数を使用します。

(3)findall関数:re.findall(pattern, string, flags=0)

任意文字列中全体を走査し、正規表現パターンにマッチする文字列を、見つかった順番で、リストとして返します。

複数のe-mailアドレスや電話番号をリストとして抽出する場合、とても役に立つ関数です。 今回は、検索を行う関数(match関数、search関数、findall関数)の解説を行いました。
他にもこのモジュールには、置換、連結、分割など、文字列を扱う上で役立つ関数が実装されています。

正規表現を使えばこんな簡単に携帯番号が抽出できる!

実際に、サンプルデータから、正規表現パターンを使って、携帯番号を抽出していきましょう。

使用するサンプルデータは、次のとおりです。

幌呂 〒 085-1199 北海道阿寒郡鶴居村幌呂西 Tel 090-0065-2150
鶴居 〒 085-1299 北海道阿寒郡鶴居村鶴居西Tel 080-0064-2120
下久著路簡易郵便局 〒 085-1362 北海道阿寒郡鶴居村下久箸呂北 Tel 090-0064-2160
旭川新富郵便局 〒 070-0002 北海道旭川市新富二条 Tel 080-0026-3902

このサンプルデータから、携帯番号(090-0065-2150, 080-0064-2120, 090-0064-2160, 080-0026-3902)を抽出します。

正規表現のサンプルコード

【使用例】
import re
 
sample_data = “幌呂 〒 085-1199 北海道阿寒郡鶴居村幌呂西 Tel 090-0065-2150, 鶴居 〒 085-1299 北海道阿寒郡鶴居村鶴居西Tel 080-0064-2120, 下久著路簡易郵便局 〒 085-1362 北海道阿寒郡鶴居村下久箸呂北 Tel 090-0064-2160, 旭川新富郵便局 〒 070-0002 北海道旭川市新富二条 Tel 080-0026-3902”
 
mobile_phone_list = re.findall(‘[0-9]{3}-[0-9]{4}-[0-9]{4}’, sample_data)
 
if mobile_phone_list:
            print (mobile_phone_list)

【実行結果】
[‘090-0065-2150’,’ 080-0064-2120’,’ 090-0064-2160’,’ 080-0026-3902’]

正規表現のコード解説

+演算子を使うとリストを結合することができます。

サンプルコードの解説です。

1行目:import re:reモジュールのインポートを行います。
2行目:サンプル文字列データを、sample_dataに代入します。
3行目:findall関数を使用し、携帯番号を抽出します。
第一引数に、携帯電話番号の正規表現パターンを代入します。
第二引数に、サンプル文字列データを代入します。
正規表現パターンにマッチする文字列が、mobile_phone_listリストに格納されます。
4~5行目:mobile_phone_listリストに格納された携帯番号出力します。

まとめ

いかがでしたか?正規表現の蓋を開けてみると、意外と簡単だったのではないでしょうか?今回は、Pythonで正規表現を実装するため、必要なモジュール・関数を解説しました。
実践で、このモジュールを使いこなし、文字列の検索、置換、連結、分割を、効率よく行いましょう!


TECH PLAYでは、エンジニアの方向けに勉強会・イベント情報を提供しています。
ご興味のある方はぜひご参加ください。


フォロワー19,530人
TECH PLAYでは、ITに関わる様々なイベント・勉強会・講演会・交流会・カンファレンス・セミナーなどの情報を集約し掲載しています。

テクノロジーと共に成長しよう、
活躍しよう。

TECH PLAYに登録すると、
スキルアップやキャリアアップのための
情報がもっと簡単に見つけられます。

面白そうなイベントを見つけたら
積極的に参加してみましょう。
ログインはこちら

タグからイベントをさがす