Python正規表現 reの使い方

Python標準ライブラリの1つで、正規表現を行うreについてご紹介します。
正規表現とは、文字の検索・文字の処理等を行うことができる機能です。

正規表現の書き方

まずは正規表現について詳しく見ていきましょう。
以下のような顧客番号のみが格納された顧客データがあったとします。

customer_data = [
                 ('0010KEA'),
                 ('0011JYB'),
                 ('0012HTY'),
                 ('0013GRT')
                 ]

この顧客番号の正規表現パターンは、次のように表します。

'^([0-9]{4})([A-Z]{3})'

・まず^は、文字列の先頭であることを表しています。

([0-9]{4})の部分について見ていきます。

これは、「0から9までの数字を、4つ繰り返す」という意味になります。サンプルデータの顧客番号は、前半は数字4つで構成されています。ですので、その特徴を正規表現で表しています。

([A-Z]{3})の部分を見てみましょう。

これは、「AからZまでの文字を、3つ繰り返す」という意味です。サンプルデータの顧客番号は、後半が大文字アルファベット3つで構成されているので、その特徴をこのように表します。

このように、一見難しそうな表現方法に見えて、実はシンプルで簡潔なのが正規表現です。正規表現は他にも色々ありますので、以下の表を参照してみてください。

正規表現他の記述方法説明
^\A文字列の先頭
$\Z文字列の末尾
.任意の一文字
*0回以上繰り返す
?0または1回以上
{m}m回繰り返す
{m,n}m~n回繰り返す
()グループ化
\d[0-9]0~9の数字
\D[^0-9]0~9の数字以外
\w[a-zA-Z0-9_]英数字
\W[\a-zA-Z0-9_]英数字以外
\s[\t\n\r\f\v]空白の文字
\S[^\t\n\r\f\v]空白の文字以外

任意の文字を取得する: re.match()

では、正規表現のメソッドについてもご紹介します。
re.match()メソッドは、任意の文字を取得します。
第一引数に取得したい文字を表す正規表現パターン、第二引数に対象のデータを指定します。

サンプルコードを見てみましょう。

変数dataから、数字を取り出す場合の処理になります。取り出したい文字は、()でグループ化します。

# データ
data = r'He is 27 years old.'

# 正規表現パターン:数字
# +は1回以上繰り返すという意味
pattern = '.*?(\d+).*'

result = re.match(pattern, data)

if result:
    print(result.group(1))

出力結果:

27

文字列の検索:re.search()

第一引数に正規表現パターンの文字列、第二引数に検索対象の文字列を指定します。
下のサンプルコードでは、文章から「27」の数字を検索しています。

import re

customer_data = 'He is 27 years old.'

pattern = '27'

rs = re.search(pattern, customer_data)
if rs is None:
  print('検索対象のデータが見つかりません')
else:
  print(f'検索対象のデータが見つかりました:{rs.group()}')

出力結果:

検索対象のデータが見つかりました:27

任意の文字列を検索することができました。

任意の文字を取得する: re.findall()

re.search()メソッドが検索でヒットした最初の結果のみを返すのに対して、re.findall()メソッドは検索結果全てをlist型で返します。
サンプルコードでre.search()メソッドとre.findall()メソッドの結果を比較してみましょう。

re.search()メソッドの場合

# 顧客番号
customer_data = '0010KEA, 0011JYB, 0012HTY, 0013GRT, 0014KEA, 0015GRT, 0016JGH, 0017JYB, 0018KEA, 0019GRT, 0020KEA'

# 正規表現:KEAで終わる文字列
pattern = '(\d{4})(KEA)'

rs = re.search(pattern, customer_data)
if rs:
    print(rs.group()) 

出力結果:

0010KEA

「KEA」で終わる顧客番号は他にもありますが、最初にマッチした結果のみを返しています。

re.findall()メソッドの場合

rs = re.findall(pattern, customer_data)
if rs:
  for result in rs:
    print(result[0], result[1])

出力結果:

0010 KEA

0014 KEA

0018 KEA 0020 KEA

検索結果全てを返していることがわかります。


Startlabのプログラミング入門コースは、Python未経験者・初学者にもわかりやすいカリキュラムと続けやすいサポート体制が魅力。自分の学習目的に合っているか、どういった知識を身に付けることができるのかなど、無料カウンセリングでぜひご相談ください!カウンセリングは毎日実施中、お待ちしております!

無料カウンセリングを予約する