Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの正規表現(RegEx)とは?基本構文と実用例をわかりやすく解説

正規表現(Regular Expression)は、与えられた文字列の中に特定のパターンが存在するかどうかを判定するための、いわばミニプログラミング言語です。一連の文字の組み合わせで検索パターンを定義し、そのパターンが文字列に含まれているかをチェックできます。

テキスト処理やデータクレンジング、入力値のバリデーションなど、さまざまな場面で活躍する強力なツールなので、ぜひマスターしておきましょう。

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

Pythonには正規表現を扱うための標準ライブラリ「re」が組み込まれています。追加のインストールは不要で、import文だけですぐに使えます。

import re

基本的な使用例

まずは最もシンプルな例として、文字列が指定したパターンに一致するかどうかを確認してみましょう。

import re
txt = "Use of python in Machine Learning"
x = re.search("^Use.*Learning$", txt)
if (x):
    print("YES! We have a match!")
else:
    print("No match")

出力結果

YES! We have a match!

この例では、「Use」で始まり「Learning」で終わる文字列かどうかを re.search() で判定しています。条件に一致したため「YES! We have a match!」と表示されました。

reモジュールの主な関数

reモジュールには、文字列からパターンを検索・操作するための便利な関数が複数用意されています。

関数説明
findall一致したすべての箇所をリストで返す
search文字列内のどこかに一致があればMatchオブジェクトを返す
split一致した箇所ごとに文字列を分割し、リストで返す
sub一致した1つまたは複数の箇所を別の文字列に置換する

メタ文字(Metacharacters)

メタ文字とは、正規表現内で特別な意味を持つ文字のことです。パターンを柔軟に記述するために欠かせない要素です。

文字説明使用例
[]文字の集合(セット)を表す"[a-m]"
\特殊シーケンスの開始、または特殊文字のエスケープ"\d"
.改行以外の任意の1文字"he..o"
^指定した文字列で始まる場合に一致"^Hello"
$指定した文字列で終わる場合に一致"World$"
*0回以上の繰り返し"aix*"
+1回以上の繰り返し"aix+"
{}指定した回数ちょうどの繰り返し"a{2}"
|いずれか一方に一致(OR条件)"short|long"
()パターンのキャプチャとグループ化 

特殊シーケンス(Special Sequences)

特殊シーケンスとは、バックスラッシュ「\」に特定の文字を続けたもので、それぞれ特別な意味を持ちます。

文字説明使用例
\A指定した文字が文字列の先頭にある場合に一致"\APyt"
\b指定した文字が単語の先頭または末尾にある場合に一致r"\bPython" / r"world\b"
\B指定した文字が存在するが、単語の先頭(または末尾)ではない場合に一致r"\BPython" / r"World\B"
\d文字列に数字が含まれる場合に一致"\d"
\D文字列に数字が含まれない場合に一致"\D"
\s空白文字が含まれる場合に一致"\s"
\S空白文字が含まれない場合に一致"\S"
\w英字(a〜z、A〜Z)、数字(0〜9)、アンダースコア(_)のいずれかが含まれる場合に一致"\w"
\W上記の単語文字が含まれない場合に一致"\W"
\Z指定した文字が文字列の末尾にある場合に一致"world\Z"

セット(Sets)

セットとは、角括弧 [] で囲んだ文字の集合のことで、その中のいずれかの文字に一致するかどうかを調べられます。

セット説明
[raj]r、a、j のいずれかが含まれる場合に一致
[a-r]a から r までの小文字アルファベットに一致
[^raj]r、a、j 以外の任意の文字に一致
[0123]0、1、2、3 のいずれかの数字に一致
[0-9]0 から 9 までの任意の数字に一致
[0-3][0-8]00 から 38 までの任意の2桁の数字に一致
[a-zA-Z]a〜z または A〜Z の任意の英字に一致
[+]文字列中の「+」という文字に一致

findall() 関数の使用例

findall() 関数は、パターンに一致したすべての箇所をリスト形式で返します。

# テキスト中のすべての "in" をリストで出力
import re
txt = "Use of python in Machine Learning"
x = re.findall("in", txt)
print(x)

出力結果

['in', 'in', 'in']

出力されたリストには、見つかった順番ですべての一致箇所が格納されています。もし一致するものが1つもなければ、空のリストが返されます。

試しに、テキスト中に存在しないパターンを指定してみましょう。

x = re.findall("Hello", txt)

出力結果

[]

search() 関数の使用例

search() 関数は文字列全体を検索し、一致が見つかればMatchオブジェクトを返します。ただし、複数の一致がある場合でも、最初に見つかった1件のみが返される点に注意してください。

import re
txt = "Python is one of the most popular languages around the world"
searchObj = re.search("\s", txt)
print("最初の空白文字の位置:", searchObj.start())

出力結果

最初の空白文字の位置: 6

一致が見つからなかった場合は None が返されます。

split() 関数の使用例

split() 関数は、パターンに一致した箇所ごとに文字列を分割し、その結果をリストで返します。

# 各空白文字で分割
import re
string = "Python is one of the most popular languages around the world"
searchObj = re.split("\s", string)
print(searchObj)

出力結果

['Python', 'is', 'one', 'of', 'the', 'most', 'popular', 'languages', 'around', 'the', 'world']

sub() 関数の使用例

sub() 関数を使うと、一致した部分を好きな文字列に置き換えることができます。

# 文字列内のすべての空白を _ に置換
import re
string = "Python is one of the most popular language around the world"
searchObj = re.sub("\s", "_", string)
print(searchObj)

出力結果

Python_is_one_of_the_most_popular_language_around_the_world

Matchオブジェクトとは

Matchオブジェクトは、検索結果に関する情報を保持するオブジェクトです。一致が見つからなかった場合は None が返されます。

例:文字列を検索してMatchオブジェクトを取得します。

import re
string = "Python is one of the most popular language around the world"
searchObj = re.search("on", string)
print(searchObj)

出力結果

<_sre.SRE_Match object; span=(4, 6), match='on'>

Matchオブジェクトには、検索結果の詳細情報を取得するためのプロパティとメソッドが用意されています。

  • .span() ― 一致箇所の開始位置と終了位置をタプルで返します。

  • .string ― 検索対象として渡された元の文字列を返します。

  • .group() ― 実際に一致した部分の文字列を返します。

例:大文字の「P」で始まる単語を検索し、一致した部分を出力します。

# 大文字 "P" で始まる単語を検索
import re
string = "Python is one of the most popular language around the world"
searchObj = re.search(r"\bP\w+", string)
print(searchObj)

出力結果

<_sre.SRE_Match object; span=(0, 6), match='Python'>

このように、Pythonの正規表現を使いこなせるようになると、文字列の検索・分割・置換といった処理を簡潔かつ効率的に記述できるようになります。まずは re モジュールの4つの基本関数から試してみてください。

  1. JavaScriptの正規表現修飾子(g・i・m)をサンプルコード付きで解説

    JavaScriptの正規表現修飾子とは JavaScriptの正規表現における修飾子(フラグ)とは、パターンリテラルの末尾に付加することで検索の挙動を変更できる、省略可能な指定のことです。これを使うことで、大文字と小文字を区別しない検索や文字列全体を対象としたグローバル検索などが簡単に実現できます。さらに、複数の修飾子を組み合わせて指定することも可能です。 主な修飾子の一覧 修飾子説明 gグローバルマッチングを有効にします。最初の一致で処理を止めず、マッチしたすべての結果を返します。 i大文字と小文字を区別しない(ignore case)マッチングを有効にします。 m複数行(mul

  2. Python正規表現のre.finditer()メソッドの使い方を解説

    Pythonで文字列から正規表現にマッチするすべての箇所を抽出したい場合、re.finditer()メソッドが便利です。この記事では、その基本的な使い方と動作をわかりやすく解説します。re.finditer()メソッドとはPython公式ドキュメントによると、構文は以下の通りです。re.finditer(pattern, string, flags=0)re.finditer()は、文字列内から正規表現パターンに一致する重複しないすべてのマッチを検索し、Matchオブジェクトを順番に返すイテレータを返します。文字列は左から右へ走査され、見つかった順にマッチ結果が返されます空のマッチも結果に含ま