Python の正規表現
1. 正規表現 (RegEx) とは
正規表現(Regular Expression)は、検索パターンを形成する一連の文字列です。テキスト内に特定のパターンが存在するかどうかを確認するために使用されます。
Python には、正規表現を扱うための組み込みパッケージとして re モジュールが用意されています。
1.1 re モジュールのインポート
re モジュールをインポートすることで、正規表現の利用が可能になります。
import re
# 文字列に "The" で始まり "Spain" で終わるパターンがあるかチェック
txt = "The rain in Spain"
x = re.search("^The.*Spain$", txt)
if x:
print("マッチしました!")
else:
print("マッチしませんでした")2. 正規表現の主要関数
re モジュールには、文字列を検索するための以下の主要な関数が用意されています。
| 関数 | 説明 |
|---|---|
| findall | すべてのマッチした部分を含むリストを返します。 |
| search | 文字列内にマッチする部分があれば、そのマッチオブジェクトを返します。 |
| split | マッチした部分で分割された文字列のリストを返します。 |
| sub | 一つまたは複数のマッチした部分を別の文字列で置換します。 |
3. メタ文字 (Metacharacters)
メタ文字は、特別な意味を持つ文字です。
| 文字 | 説明 | 例 |
|---|---|---|
| [] | 文字の集合を指定 | "[a-m]" |
| ** | 特殊シーケンスの開始、または特殊文字のエスケープ | "\d" |
| . | 任意の1文字(改行を除く) | "he..o" |
| ^ | 行の先頭 | "^hello" |
| $ | 行の末尾 | "planet$" |
| ***** | 0回以上の繰り返し | "he.*o" |
| + | 1回以上の繰り返し | "he.+o" |
| ? | 0回または1回の出現 | "he.?o" |
| {} | 指定した回数の繰り返し | "he.{2}o" |
| | | いずれか(OR) | "falls|stays" |
| () | グループ化 |
4. 特殊シーケンス (Special Sequences)
特殊シーケンスは、\ の後に特定の文字を続けることで定義される検索パターンです。
| シーケンス | 説明 | 例 |
|---|---|---|
| \A | 文字列の先頭にあればマッチ | "\AThe" |
| \b | 指定した文字が単語の先頭、または末尾にあればマッチ | r"\bain" r"ain\b" |
| \B | 指定した文字が単語の先頭、または末尾になければマッチ | r"\Bain" r"ain\B" |
| \d | 数字(0-9)にマッチ | "\d" |
| \D | 数字以外にマッチ | "\D" |
| \s | 空白文字(スペース、タブ、改行など)にマッチ | "\s" |
| \S | 空白文字以外にマッチ | "\S" |
| \w | 英数字およびアンダースコア(a-z, A-Z, 0-9, _)にマッチ | "\w" |
| \W | 英数字およびアンダースコア以外にマッチ | "\W" |
| \Z | 文字列の末尾にあればマッチ | "Spain\Z" |
5. セット (Sets)
セット(集合)は、角括弧 [] 内に記述された一連の文字です。
| セット | 説明 |
|---|---|
| [arn] | a, r, n のいずれかの文字があるか |
| [a-n] | a から n までの小文字のいずれかがあるか |
| [^arn] | a, r, n 以外の任意の文字があるか |
| [0123] | 指定された数字(0, 1, 2, 3)のいずれかがあるか |
| [0-9] | 0 から 9 までの任意の数字があるか |
| [0-5][0-9] | 00 から 59 までの2桁の数字があるか |
| [a-zA-Z] | アルファベット(大文字・小文字問わず)があるか |
| [+] | セット内では +, *, ., |, (), $, {} は特別な意味を持たず、文字通りに解釈される |
6. 各関数の詳細
6.1 findall() 関数
マッチしたすべての文字列をリスト形式で返します。
import re
txt = "The rain in Spain"
x = re.findall("ai", txt)
print(x) # ['ai', 'ai'] を出力マッチが見つからなかった場合は空のリストを返します。
6.2 search() 関数
文字列を検索し、マッチした場合はその最初の位置に関するマッチオブジェクトを返します。
import re
txt = "The rain in Spain"
x = re.search("\s", txt)
print("最初の空白文字の位置:", x.start())6.3 split() 関数
マッチした箇所で文字列を分割したリストを返します。
import re
txt = "The rain in Spain"
# 空白文字ですべて分割
x = re.split("\s", txt)
print(x)分割する回数を制限することも可能です。
# 最初の1回だけ分割
x = re.split("\s", txt, 1)
print(x)6.4 sub() 関数
マッチした部分を指定した別のテキストに置換します。
import re
txt = "The rain in Spain"
# 空白を "9" に置換
x = re.sub("\s", "9", txt)
print(x)置換回数を指定することもできます。
# 最初の2箇所だけ置換
x = re.sub("\s", "9", txt, 2)
print(x)7. マッチオブジェクト (Match Object)
マッチオブジェクトは、検索の結果に関する情報を含んでいます。
注: マッチが見つからなかった場合、re.search() などの関数は None を返します。
マッチオブジェクトには、情報を抽出するための以下のプロパティやメソッドがあります。
.span(): マッチの開始位置と終了位置を含むタプルを返します。.string: 関数に渡された元の文字列を返します。.group(): マッチした文字列の一部を返します。
import re
txt = "The rain in Spain"
x = re.search(r"\bS\w+", txt)
print(x.span()) # マッチした位置をタプルで表示
print(x.string) # 元の文字列を表示
print(x.group()) # マッチした単語を表示