書きながら覚えよう!Pythonで正規表現を使う方法【初心者向け】
初心者向けにPythonで正規表現を使う方法について解説しています。正規表現を活用することで、自然言語処理と呼ばれるAI技術を用いた処理を行うこともできます。普段見慣れないような特殊な書き方をするので、実際に書きながら理解すると良いでしょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
監修してくれたメンター
太田 和樹
普段は主に、Web系アプリケーション開発のプロジェクトマネージャーとプログラミング講師を行っている。仕事のほとんどをリモートオフィスで行う。
今回は、Pythonで正規表現を使う方法について、テックアカデミーのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。
普段見慣れない文字を入力していますが、実際に書いてみて慣れていきましょう。
目次
そもそもPythonについてよく分からないという方は、Pythonとは何なのか解説した記事を読むとさらに理解が深まります。
Pythonの正規表現とは
正規表現とは、文字列を1つのパターン化した文字列で表現する表記法です。
正規表現を使用して、文字列をパターン化した文字列に置き換えることで、文字列の検索や置換を行えます。
また、自然言語処理といったAI技術の基礎的な処理も行うことができます。
メタ文字
正規表現において、パターン化した文字列のことをメタ文字と言います。
★は文字列を意味します。
メタ文字 | 説明 | 指定例 | 合致する |
. | 任意の1文字 | a.c | abc, acc, aac |
^ | 行の先頭 | ^abc | abcdef |
$ | 行の末尾 | abc$ | defabc |
* | 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, aaaa |
[★] | ★のどれか1文字 | [a-c] | a, b, c |
★|★ | ★のどれか | a|b | a, b |
特殊シーケンス
よく利用される正規表現のパターンは、特殊シーケンスと呼ばれます。
特殊シーケンスは、(バックスラッシュ)を先頭に記載します。
特殊シーケンス | 説明 | 同じ意味の正規表現 |
d | 任意の数字 | [0-9] |
D | 任意の数字以外 | [^0-9] |
s | 任意の空白文字 | [tnrfv] |
S | 任意の空白文字以外 | [^tnrfv] |
w | 任意の英数字 | [a-xA-Z0-9_] |
W | 任意の英数字以外 | [a-xA-Z0-9_] |
A | 文字列の先頭 | ^ |
Z | 文字列の末尾 | $ |
Pythonで正規表現を使う方法
Pythonではreモジュールを使って正規表現を扱います。
reモジュールをimportすることで正規表現を利用できます。
import re
importを詳しく知りたい人は、Pythonでimportを使う方法について解説している記事もあわせてお読みください。
reモジュールには、以下のような関数があります。
- match():文字列の先頭から正規表現にマッチしている部分を返す
- fullmatch():文字列全体が正規表現にマッチしているかを返す
- search():文字列中で正規表現にマッチする最初の部分を返す
- findall():文字列中で正規表現にマッチするすべての部分を文字列のリストで返す
- finditer():文字列中で正規表現にマッチするすべての部分をイテレータとして返す
- sub():文字列中で正規表現にマッチする部分を置換して返す
- subn():文字列中で正規表現にマッチする部分を置換してタプル(置換後文字列, マッチした数)で返す
- split():文字列を指定した正規表現で分割する
それぞれの関数について、サンプルをもとに書き方を確認していきましょう。
match()関数の書き方
文字列の先頭から正規表現にマッチしている部分を返します。
結果はマッチした情報を取りまとめた「マッチオブジェクト」で返ります。
マッチオブジェクトからマッチした文字列を取り出す方法は、次の具体例でご紹介します。
マッチしない場合、Noneが返ります。
書き方のサンプル:
# マッチする例 result = re.match(r'a.c', 'abcdefg') print(result) # マッチしない例(Noneが返る) result = re.match(r'a.c', 'Alphabet starts with abcdefg.') print(result)
解説:
match関数で、文字列の先頭から正規表現「r’a.c’」にマッチしている部分を検索します。
マッチした場合の例では、マッチオブジェクトが返ります。
マッチオブジェクトの「span」はマッチした位置を表しています。
今回の場合、0~2文字目がマッチした位置になります(3文字目は含みません)。
実行結果:
<re.Match object; span=(0, 3), match='abc'> None
マッチオブジェクトの「match」はマッチした文字列を表しています。
fullmatch()関数の書き方
文字列全体が正規表現にマッチしているかを返します。
結果はマッチオブジェクトで返ります。
マッチしない場合、Noneが返ります。
書き方のサンプル:
# マッチする例 result = re.fullmatch(r'a.c', 'abc') print(result) # マッチしない例(Noneが返る) result = re.fullmatch(r'a.c', 'abcde') print(result)
解説:
fullmatch関数で、文字列全体が正規表現「r’a.c’」にマッチしているかを確認します。
マッチした場合の例では、マッチオブジェクトが返ります。
span、matchについてはmatch関数と同様ですので説明は省略します。
実行結果:
<re.Match object; span=(0, 3), match='abc'> None
search()関数の書き方
文字列中で正規表現にマッチする最初の部分を返します。
結果はマッチオブジェクトで返ります。
マッチしない場合、Noneが返ります。
書き方のサンプル:
# マッチする例 result = re.search(r'a.c', 'Alphabet starts with abcdefg.') print(result) # マッチしない例(Noneが返る) result = re.search(r'a.c', 'Alphabet ends with xyz.') print(result)
解説:
search関数で、文字列の中で正規表現「r’a.c’」にマッチしている部分を検索します。
マッチした場合の例では、マッチオブジェクトが返ります。
実行結果:
<re.Match object; span=(21, 24), match='abc'> None
findall()関数の書き方
文字列中で正規表現にマッチするすべての部分を文字列のリストで返します。
マッチしない場合、空のリストが返ります。
書き方のサンプル:
# マッチする例 result = re.findall(r'a.c', 'Alphabet starts with abcdefg. Not adcbefg.') print(result) # マッチしない例(空のリストが返る) result = re.findall(r'a.c', 'Alphabet ends with xyz.') print(result)
解説:
findall関数で、文字列の中で正規表現「r’a.c’」にマッチしている部分を検索します。
マッチした場合の例では、マッチしたすべての部分が文字列のリストで返ります。
実行結果:
['abc', 'adc'] []
finditer()関数の書き方
文字列中で正規表現にマッチするすべての部分をイテレータとして返します。
イテレータとは、繰り返しで要素を取得できるPythonの機能です。
マッチしない場合、空のイテレータが返ります。
書き方のサンプル:
result = re.finditer(r'a.c', 'Alphabet starts with abcdefg. Not adcbefg.') # マッチする例。繰り返しで正規表現オブジェクトを取得できる for s in result: print(s) # マッチしない例。空のイテレータが返る result = re.finditer(r'a.c', 'Alphabet ends with xyz.') for s in result: print(s)
解説:
finditer関数で、文字列の中で正規表現「r’a.c’」にマッチしている部分を検索します。
マッチした場合の例では、マッチしたすべての部分をイテレータ経由で取得できます。
実行結果:
<re.Match object; span=(21, 24), match='abc'> <re.Match object; span=(34, 37), match='adc'>
sub()関数の書き方
文字列中で正規表現にマッチする部分を置換して返します。
マッチしない場合、置換は行われません。
書き方のサンプル:
# マッチする例。置換後の文字列が返る result = re.sub(r'a.c', r'ABC', 'Alphabet starts with abcdefg. Not adcbefg.') print(result) # マッチしない場合は置換されない result = re.sub(r'a.c', r'ABC', 'Alphabet ends with xyz.') print(result)
解説:
sub関数で、文字列の中で正規表現「r’a.c’」にマッチしている部分を置換します。
マッチした場合の例では、マッチしたすべての部分がABCに置換されて返ります。
実行結果:
Alphabet starts with ABCdefg. Not ABCbefg. Alphabet ends with xyz.
subn()関数の書き方
文字列中で正規表現にマッチする部分を置換してタプル(置換後文字列, マッチした数)で返します。
書き方のサンプル:
# マッチする例。タプル(置換後文字列, マッチした数)が返る result = re.subn(r'a.c', r'ABC', 'Alphabet starts with abcdefg. Not adcbefg.') print(result) # マッチしない場合は置換されない。タプルの「マッチした数」は0となる result = re.subn(r'a.c', r'ABC', 'Alphabet ends with xyz.') print(result)
解説:
subn関数で、文字列の中で正規表現「r’a.c’」にマッチしている部分を置換します。
マッチした場合の例では、マッチしたすべての部分がABCに置換されてタプルで返ります。
実行結果:
('Alphabet starts with ABCdefg. Not ABCbefg.', 2) ('Alphabet ends with xyz.', 0)
split()関数の書き方
文字列を指定した正規表現で分割して文字列のリストで返します。
マッチしない場合、そのままの文字列が返ります。
書き方のサンプル:
# マッチする例。 result = re.split(r'[0-9]', '1first2second3third') print(result) # マッチしない例。そのままの文字列が返る result = re.split(r'[0-9]', 'first,second,third') print(result)
解説:
split関数で、文字列の中で正規表現「r'[0-9]’」にマッチしている部分を検索します。
マッチした場合の例では、マッチした正規表現で分割した文字列のリストで返ります。
実行結果:
['', 'first', 'second', 'third'] ['first,second,third']
Pythonで正規表現を書いてみよう
今回は、文章の中に数字のパスワードが潜んでいると仮定します。
今回は1行程度の文章ですが、実際は1冊の本の中からメタ文字で指定した目的の文字を検索するために使用します。
これを自然言語処理と言います。
数字を検索するプログラムソースコード
正規表現を使い、文章の中から数字を検索するプログラムを書いてみましょう。
今回は「2018」という数字が検索されます。
import re match = re.search(r'd+', 'For a cybersecurity focus, you must add a sound knowledge of networking, exposure to security tools, and an und2018erstanding of Python programming language.”') print('password:', match.group(0))
解説:
以下でソースコードの処理について詳しく説明しています。
1行目のimport reではreモジュールをimportしています。
2行目のmatch = re.search(r’d+’,’文字列’)では、文字列内のr’d+’(数字)をre.search(探して)、matchに代入しています。
3行目のmatch.group(0)では、matchに代入した値のうちに、.group(0)で検索数字として適合した部分を取り出すgroupメソッドを利用しています。
そして、print文で適合した部分をpassword:という文字列と一緒に表示します。
今回、文字列の中に隠れていた数字は「2018」でした。
実行結果:
('password:', '2018')
まとめ
今回は、Pythonで正規表現を使う方法を解説しました。
正規表現を使うと、複雑な条件を簡潔に記載できます。
AIを使った自然言語処理にも役立つ技術ですので、しっかりと身に付けましょう。
入門向けPythonの学習サイトも記事にしているので、学習したい方は参考にしてみてください。
Pythonを学習中の方へ
これで解説は終了です、お疲れさまでした。
- つまずかず「効率的に」学びたい
- 副業や転職後の「現場で使える」知識やスキルを身につけたい
プログラミングを学習していて、このように思ったことはありませんか?
テックアカデミーのPythonコースでは、第一線で活躍する「プロのエンジニア」が教えているので、効率的に実践的なスキルを完全オンラインでしっかり習得できます。
合格率10%の選考を通過した、選ばれたエンジニアの手厚いサポートを受けながら、人工知能(AI)や機械学習の基礎を学べます。
まずは一度、無料体験で学習の悩みや今後のキャリアについて話してみて、「現役エンジニアから教わること」を実感してみてください。
時間がない方、深く知ってから体験してみたい方は、今スグ見られる説明動画から先に視聴することをおすすめします!