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