Python 正規表現

Note: 正規表現は、検索パターンを形成する文字のシーケンスです。

正規表現は指定した検索パターンが文字列に含まれるかどうかをチェックするために使用されます。

RegEx モジュール

Python には正規表現を扱うための組み込みパッケージ re があります。

re モジュールのインポート

import re

Python における正規表現

re モジュールをインポートしたら、正規表現を使用できます:

文字列が “The” で始まり “Spain” で終わるかどうかを調べます:

import re

txt = "The rain in Spain"
x = re.search("^The.*Spain$", txt)

RegEx 関数

re モジュールには、文字列を検索して一致するものを見つけるための関数群が用意されています:

関数 説明
findall() 全ての一致を含むリストを返します
search() 文字列全体で一致がある場合は Match オブジェクトを返します
split() 一致した場所で文字列を分割したリストを返します
sub() 一致した文字列を指定した文字列で置換します

メタ文字

メタ文字は特別な意味を持つ文字です:

文字 説明
[] 一連の文字を表します “[a-m]”
\ 特別なシーケンスを示します(特殊文字をエスケープするためにも使用します) “\d”
. 改行文字を除く任意の文字 “he..o”
^ 文字列の先頭 “^hello”
$ 文字列の末尾 “planet$”
* 0回以上の出現 “he.*o”
+ 1回以上の出現 “he.+o”
? 0回または1回の出現 “he.?o”
{} 指定した回数の出現 “he.{2}o”
| どちらか一方 “falls|stays”
() キャプチャおよびグループ化

特殊シーケンス

特殊シーケンスは \ の後に特定の文字が続き、特別な意味を持ちます:

文字 説明
\A 文字列の先頭に指定した文字がある場合に一致します “\AThe”
\b 単語の先頭または末尾に指定した文字がある場合に一致します(行頭に “r” があることで “raw string” として扱われることに注意してください) r”\bain” r”ain\b”
\B 指定した文字が存在する場合に一致しますが、単語の先頭(または末尾)ではありません(行頭に “r” があることで “raw string” として扱われることに注意してください) r”\Bain” r”ain\B”
\d 文字列に数字(0~9)が含まれる場合に一致します “\d”
\D 文字列に数字が含まれない場合に一致します “\D”
\s 文字列に空白文字が含まれる場合に一致します “\s”
\S 文字列に空白文字が含まれない場合に一致します “\S”
\w 文字列に単語文字(a ~ Z、0 ~ 9、およびアンダースコア _)が含まれる場合に一致します “\w”
\W 文字列に単語文字が含まれない場合に一致します “\W”
\Z 文字列の末尾に指定した文字がある場合に一致します “Spain\Z”

セット

セットは、角かっこ [] の中に特別な意味を持つ文字のセットを指定します:

セット 説明
[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 までの任意の二桁の数字に一致します
[a-zA-Z] 小文字または大文字のアルファベット順の任意の文字に一致します
[+] セット内では特に意味を持ちません。+ 文字自体に一致します

findall() 関数

findall() 関数はすべての一致を含むリストを返します。

すべての一致した文字列をリストで表示します:

import re

txt = "The rain in Spain"
x = re.findall("ai", txt)
print(x)

リストは一致した順に表示されます。

一致するものがない場合、空のリストが返されます:

一致しなかった場合は空のリストが返されます:

import re

txt = "The rain in Spain"
x = re.findall("Portugal", txt)
print(x)

search() 関数

search() 関数は文字列全体を検索し、一致がある場合は Match オブジェクトを返します。

複数の一致がある場合、最初の一致のみが返されます:

文字列内の最初の空白文字を検索します:

import re

txt = "The rain in Spain"
x = re.search("\s", txt)

print("最初の空白文字は位置:", x.start())

一致がない場合、値 None が返されます:

一致しなかった場合の検索:

import re

txt = "The rain in Spain"
x = re.search("Portugal", txt)
print(x)

split() 関数

split() 関数は一致した場所で文字列を分割したリストを返します:

各空白文字で分割します:

import re

txt = "The rain in Spain"
x = re.split("\s", txt)
print(x)

maxsplit パラメータを指定することで、分割数を制御できます:

最初の一致でのみ分割します:

import re

txt = "The rain in Spain"
x = re.split("\s", txt, 1)
print(x)

sub() 関数

sub() 関数は一致した文字列を指定したテキストで置換します:

各空白文字を数字 9 で置換します:

import re

txt = "The rain in Spain"
x = re.sub("\s", "9", txt)
print(x)

count パラメータを指定することで、置換数を制御できます:

最初の 2 つの一致を置換します:

import re

txt = "The rain in Spain"
x = re.sub("\s", "9", txt, 2)
print(x)

Match オブジェクト

Match オブジェクトは検索と結果に関する情報を含むオブジェクトです。

注意:一致がない場合、Match オブジェクトの代わりに値 None が返されます。

Match オブジェクトを返す検索:

import re

txt = "The rain in Spain"
x = re.search("ai", txt)
print(x) # これはオブジェクトを出力します

Match オブジェクトには、検索と結果に関する情報を取得するためのプロパティやメソッドがあります:

  • .span(): 一致の開始位置と終了位置を含むタプルを返します。
  • .string: 関数に渡された文字列を返します。
  • .group(): 一致の部分を返します。

最初の一致位置(開始位置と終了位置)を出力します。

正規表現は大文字 “S” で始まる単語を探します:

import re

txt = "The rain in Spain"
x = re.search(r"\bS\w+", txt)
print(x.span())

関数に渡された文字列を出力します:

import re

txt = "The rain in Spain"
x = re.search(r"\bS\w+", txt)
print(x.string)

一致の部分を出力します。

正規表現は大文字 “S” で始まる単語を探します:

import re

txt = "The rain in Spain"
x = re.search(r"\bS\w+", txt)
print(x.group())

注意:一致がない場合、Match オブジェクトの代わりに値 None が返されます。