Pythonの正規表現とは?実際の使い方や関数の種類、応用方法などを分かりやすく解説
文字列操作は多くのプログラミングタスクで必要不可欠ですが、複雑なパターンを扱う場合、通常の文字列メソッドでは限界があります。そこで活躍するのが正規表現です。Pythonの正規表現を使いこなすことで、複雑な文字列の検索や置換を効率的におこなえます。
本記事では、Pythonの正規表現の基本から応用まで、実例を交えて詳しく解説します。reモジュールの使い方、パターンの記述方法、そして高度な技法まで、段階的に学んでいきましょう。
Contents
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モジュールの関数、メタ文字などを組み合わせると、複雑な文字列処理ができます。ぜひ活用してテキスト処理のスキルを伸ばしてください。
正規表現を活用してテキスト処理のスキルを高めたら、次のキャリアステップに活かしてみませんか?
アールストーンでは、専属のコンサルタントが企業との直接交渉をおこない、あなたの魅力を最大限に引き出します。ぜひ一度、アールストーンの無料相談をご利用ください。