icon
icon

書きながら覚えよう!Pythonで正規表現を使う方法【初心者向け】

初心者向けにPythonで正規表現を使う方法について解説しています。正規表現を活用することで、自然言語処理と呼ばれるAI技術を用いた処理を行うこともできます。普段見慣れないような特殊な書き方をするので、実際に書きながら理解すると良いでしょう。

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日  調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名  調査手法:インターネット調査

監修してくれたメンター

太田 和樹

ITベンチャー企業のPM兼エンジニア
普段は主に、Web系アプリケーション開発のプロジェクトマネージャーとプログラミング講師を行っている。仕事のほとんどをリモートオフィスで行う。

今回は、Pythonで正規表現を使う方法について、テックアカデミーのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。

普段見慣れない文字を入力していますが、実際に書いてみて慣れていきましょう。

目次

1時間でできる無料体験!

そもそも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']

 

[PR] Pythonで挫折しない学習方法を動画で公開中

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')

 

コラム

コスパとタイパ、両方結果的に良くなる良くなる学び方とは?

「スクールは高いし時間も縛られて効率が悪い」と考える方は多いと思います。
もちろん、時間も費用もかかることは間違いありません。
ただ 結果的に無駄な学びにお金も時間もかける方がリスクが高いという考えもあります。

コスパ・タイパ最適化の参考として、 テックアカデミー卒業生がスクールを選んだ理由 をご紹介します。

  • ・困ったときに、質問や相談できる相手がいるため挫折しなかった
  • ・プロとして必要なスキルのみを深く学べたので無駄がなかった
  • ・副業案件の提供と納品までのサポートがあったので目的を達成できた

安価・短期間で広く浅く学んでも意味がありません。 本当に自分の目的が達成できるか、それが重要です。
自分にどのスキルや学び方が合っているか、どんな学習方法かなど、お気軽に 無料相談 に参加してみませんか?

カウンセラー・現役のプロへ、何でも気軽に無料相談可能。 30分か60分お好きな時間が選べて、かつ3回まで すべて無料で ご利用できます。
無理な勧誘は一切ない ので、お気軽にご参加ください。

今なら相談した方限定の割引・参加特典付き! 無料相談はこちら

まとめ

今回は、Pythonで正規表現を使う方法を解説しました。

正規表現を使うと、複雑な条件を簡潔に記載できます。

AIを使った自然言語処理にも役立つ技術ですので、しっかりと身に付けましょう。

入門向けPythonの学習サイトも記事にしているので、学習したい方は参考にしてみてください。

 

Pythonを学習中の方へ

これで解説は終了です、お疲れさまでした。

  • つまずかず「効率的に」学びたい
  • 副業や転職後の「現場で使える」知識やスキルを身につけたい

プログラミングを学習していて、このように思ったことはありませんか?

テックアカデミーのPythonコースでは、第一線で活躍する「プロのエンジニア」が教えているので、効率的に実践的なスキルを完全オンラインでしっかり習得できます。

合格率10%の選考を通過した、選ばれたエンジニアの手厚いサポートを受けながら、人工知能(AI)や機械学習の基礎を学べます。

まずは一度、無料体験で学習の悩みや今後のキャリアについて話してみて、「現役エンジニアから教わること」を実感してみてください。

時間がない方、深く知ってから体験してみたい方は、今スグ見られる説明動画から先に視聴することをおすすめします!

初心者・未経験でもできる。まずはテックアカデミーに相談しよう

プログラミングを独学で学習していて、このように感じた経験はないでしょうか?

  • ・調べてもほしい情報が見つからない
  • ・独学のスキルが実際の業務で通用するのか不安
  • ・目標への学習プランがわからず、迷子になりそう

テックアカデミーでは、このような 学習に不安を抱えている方へ、マンツーマンで相談できる機会を無料で提供 しています。
30分間、オンラインでどんなことでも質問し放題です。

「受けてよかった」と感じていただけるよう カウンセラーやエンジニア・デザイナー があなたの相談に真摯に向き合います。

「自分に合っているか診断してほしい」
「漠然としているが話を聞いてみたい」

こんなささいな悩みでも大丈夫です。

無理な勧誘は一切ありません ので、まずはお気軽にご参加ください。
※体験用のカリキュラムも無料で配布いたします。(1週間限定)

今なら参加者限定の割引特典付き! 無料相談を予約する