IT・WEB・ゲーム業界の転職に強いR-Stone

転職コラム

Pythonの正規表現とは?実際の使い方や関数の種類、応用方法などを分かりやすく解説

文字列操作は多くのプログラミングタスクで必要不可欠ですが、複雑なパターンを扱う場合、通常の文字列メソッドでは限界があります。そこで活躍するのが正規表現です。Pythonの正規表現を使いこなすことで、複雑な文字列の検索や置換を効率的におこなえます。

本記事では、Pythonの正規表現の基本から応用まで、実例を交えて詳しく解説します。reモジュールの使い方、パターンの記述方法、そして高度な技法まで、段階的に学んでいきましょう。

Pythonの正規表現とは何を指す?

正規表現は、文字列のパターンを記述するための手法で、多くのプログラミング言語で利用されます。

正規表現により、特定の文字列の検索や置換が容易になります。

Pythonでは、reモジュールを使用してパターンマッチングや文字列操作をおこなえます。

Pythonの正規表現を役立てられる場面

Pythonの正規表現は、入力されたメールアドレスや電話番号の形式チェック、HTMLタグの抽出、ログファイルからの情報抽出など多くの場面で使用できます。

正規表現を使うと、上記の作業を簡潔なコードで実現でき、複雑なコードを書く手間を省けます。

Pythonの正規表現の使い方

Pythonで正規表現を使う、基本的な流れを見ていきましょう。

まずはreモジュールをインポート

Pythonで正規表現を使うには、reモジュールをインポートする必要があります。

import re

文字列を記述

正規表現パターンは特殊な文字や記号を使って表現します。

# メールアドレスを抽出するための正規表現の例

pattern = r’\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b’

関数を用いて検索・抽出

reモジュールの関数を使って、文字列からパターンに一致する部分を検索したり抽出したりします。

text = “Hello, my email is example@email.com”

result = re.search(pattern, text)   # search()関数を使ってメールアドレスを検索

if result:

    print(“見つかったメールアドレス:”, result.group())

 

正規表現に使う関数の種類

Pythonの正規表現では、目的に応じてさまざまな関数を使用できます。

本項では、代表的な6つの関数を説明します。

match関数:先頭で一致するものを検索

match関数は、文字列の先頭から正規表現パターンと一致するかどうかを調べます。先頭で一致しない場合はNoneを返します。

# 構文:re.match(パターン, 対象文字列[, フラグ])

“””

パターン: 検索する正規表現パターン(文字列またはコンパイル済みの正規表現オブジェクト)。

対象文字列: 検索対象の文字列。

フラグ: 正規表現の動作を変更するためのフラグ(デフォルトは0)。re.IGNORECASEなど。

戻り値: 一致が見つかった場合はマッチオブジェクトを返し、一致が見つからない場合はNoneを返します。

“””

# パターン”Hello”は先頭で一致するのでマッチオブジェクトを返す

print(re.match(r”Hello”, “Hello, World!”))  # <re.Match object; span=(0, 5), match=’Hello’>

 

# パターン”World”は先頭で一致しないのでNoneを返す

print(re.match(r”World”, “Hello, World!”))  # None

search関数:一致するものを先頭に限らず検索

search関数は、文字列全体を検索し、最初に見つかった一致箇所を返します。match関数とは異なり、先頭に限らず検索をおこないます。

# 構文:re.search(パターン, 対象文字列[, フラグ])

“””

パターン: 検索する正規表現パターン(文字列またはコンパイル済みの正規表現オブジェクト)。

対象文字列: 検索対象の文字列。

フラグ: 正規表現の動作を変更するためのフラグ(デフォルトは0)。re.IGNORECASEなど。

戻り値: 一致が見つかった場合はマッチオブジェクトを返し、一致が見つからない場合はNoneを返します。

“””

 

# パターン”World”は文字列内に存在するのでマッチオブジェクトを返す

print(re.search(r”World”, “Hello, World!”))  # <re.Match object; span=(7, 12), match=’World’>

findall関数:一致するものをリストで抽出

findall関数は、文字列内で正規表現パターンに一致するすべての箇所を見つけ、リストとして返します。

# 構文:re.findall(パターン, 対象文字列[, フラグ])

“””

パターン: 検索する正規表現パターン(文字列またはコンパイル済みの正規表現オブジェクト)。

対象文字列: 検索対象の文字列。

フラグ: 正規表現の動作を変更するためのフラグ(デフォルトは0)。re.IGNORECASEなど。

戻り値: 一致した部分文字列のリストを返します。一致しない場合、空のリストを返します。

“””

 

# すべての単語を抽出する

words = re.findall(r”\w+”, “The quick brown fox jumps over the lazy dog”)

print(words)  # [‘The’, ‘quick’, ‘brown’, ‘fox’, ‘jumps’, ‘over’, ‘the’, ‘lazy’, ‘dog’]

finditer関数:一致するものをすべて抽出

finditer関数は、findall関数と似ていますが、イテレータオブジェクトを返します。

イテレータを使って、一致した箇所の詳細な情報(位置など)にアクセスできます。

# 構文:re.finditer(パターン, 対象文字列[, フラグ])

“””

パターン: 検索する正規表現パターン(文字列またはコンパイル済みの正規表現オブジェクト)。

対象文字列: 検索対象の文字列。

フラグ: 正規表現の動作を変更するためのフラグ(デフォルトは0)。re.IGNORECASEなど。

戻り値: 一致した部分文字列のマッチオブジェクトを返すイテレータ。

“””

 

# すべての単語とその位置を抽出する

for match in re.finditer(r”\w+”, “The quick brown fox”):

    print(f”Found ‘{match.group()}‘ at position {match.start()})

# 出力:

# Found ‘The’ at position 0

# Found ‘quick’ at position 4

# Found ‘brown’ at position 10

# Found ‘fox’ at position 16

fullmatch関数:完全に一致するもののみを抽出

fullmatch関数は、文字列全体が正規表現パターンと完全に一致する場合にのみ結果を返します。部分的な一致では結果を返しません。

# 構文:re.fullmatch(パターン, 対象文字列[, フラグ])

“””

パターン: 検索する正規表現パターン(文字列またはコンパイル済みの正規表現オブジェクト)。

対象文字列: 検索対象の文字列。

フラグ: 正規表現の動作を変更するためのフラグ(デフォルトは0)。re.IGNORECASEなど。

戻り値: 一致が見つかった場合はマッチオブジェクトを返し、一致が見つからない場合はNoneを返します。

“””

 

# 完全に一致する場合

print(re.fullmatch(r”Python”, “Python”))  # <re.Match object; span=(0, 6), match=’Python’>

 

# 部分的に一致する場合

print(re.fullmatch(r”Pyth”, “Python”))  # None

sub関数:一致した文字列を置換して抽出

sub関数は、正規表現パターンに一致した箇所を別の文字列に置換します。

# 構文:re.sub(パターン, 置換内容, 対象文字列[, 回数, フラグ])

“””

パターン: 検索する正規表現パターン(文字列またはコンパイル済みの正規表現オブジェクト)。

置換内容: 一致した部分を置換する文字列または関数。

対象文字列: 検索対象の文字列。

回数: 置換する上限回数(デフォルトは0、すべてを置換)。

フラグ: 正規表現の動作を変更するためのフラグ(デフォルトは0)。re.IGNORECASEなど。

戻り値: 置換後の文字列を返します。

“””

 

# “apples”を”oranges”に置換する

result = re.sub(r”apples”, “oranges”, “I love apples”)

print(result)  # I love oranges

正規表現のパターンを表す記号一覧

正規表現のパターンを表す記号には、メタ文字と特殊シーケンスがあり、特別な記号を使うことで、複雑な文字列のパターンを簡潔に表現できます。

正規表現を使いこなすのに必要な、記号の意味と使い方をご紹介します。

メタ文字

メタ文字は、正規表現で特別な意味を持つ文字です。

以下は、メタ文字を使用した正規表現と文字列のマッチをおこなう例です。

# 例: hel*o

pattern1 = r’hel*o’

test_strings1 = [‘heo’, ‘helo’, ‘hellllo’]

 

for test in test_strings1:

    if re.match(pattern1, test):

        print(f”{test}: マッチしました”)

 

# 出力:

# heo: マッチしました

# helo: マッチしました

# hellllo: マッチしました

特殊シーケンス

特殊シーケンスは、バックスラッシュ(\)で始まり、特定の文字種とマッチします。

以下は、特殊シーケンスとのマッチをおこなう例です。

# 例: user\d\d\d

pattern2 = r’user\d\d\d’

test_strings2 = [‘user000’, ‘user123’, ‘user999’]

 

for test in test_strings2:

    if re.match(pattern2, test):

        print(f”{test}: マッチしました”)

 

# 出力:

# user000: マッチしました

# user123: マッチしました

# user999: マッチしました

 

# 例: user\d\d\D

pattern3 = r’user\d\d\D’

test_strings3 = [‘user00A’, ‘user12R’, ‘user999’]

 

for test in test_strings3:

    if re.match(pattern3, test):

        print(f”{test}: マッチしました”)

 

# 出力:

# user00A: マッチしました

# user12R: マッチしました

【ステップアップ】Pythonの正規表現における応用方法

本項では、正規表現をより効率的に使うための3つの応用方法をご紹介します。

正規表現のパターンをコンパイル

re.compile()関数を使うと、パターンをコンパイルできます。

コンパイルしたパターンは繰り返し使用でき、同じパターンを複数回使う場合に処理速度を向上できます。

import re

 

pattern = re.compile(r’\d+’# 数字の並びにマッチするパターン

text = “123abc456def789”

matches = pattern.findall(text)

print(matches)  # [‘123’, ‘456’, ‘789’]

特殊文字をエスケープ

正規表現では、ピリオド(.)などの文字が特別な意味を持ちますが、特別な文字を文字通りに扱いたい場合は、エスケープ処理が必要です。

re.escape()関数を使うと、特殊文字を自動的にエスケープできます。

import re

 

text = “How much is $100.00?”

pattern = re.escape(“$100.00”# ドル記号($)とピリオド(.)を文字そのものとして扱うパターンを取得

match = re.search(pattern, text)

print(match.group())  # $100.00

大文字・小文字を区別せずにマッチング

正規表現で、大文字と小文字を区別せずにマッチングしたい場合は、re.IGNORECASEフラグを使用します。

import re

 

text = “Python is COOL!”

pattern = r’python’

match = re.search(pattern, text, re.IGNORECASE) # 大文字・小文字 両方にマッチする

print(match.group())  # Python

まとめ

reモジュールの関数、メタ文字などを組み合わせると、複雑な文字列処理ができます。ぜひ活用してテキスト処理のスキルを伸ばしてください。

正規表現を活用してテキスト処理のスキルを高めたら、次のキャリアステップに活かしてみませんか?

アールストーンでは、専属のコンサルタントが企業との直接交渉をおこない、あなたの魅力を最大限に引き出します。ぜひ一度、アールストーンの無料相談をご利用ください。