正規表現

文字列から特定のパターンを探すのに、正規表現(reモジュール)を使います。

パターンで使う文字

パターンは、通常の文字や特殊文字などを組合せて表現します(日本語も使えます)。

特殊文字説明matchする例matchしない例
.改行以外の任意の一文字a.cabcac abbc
^文字列の先頭^ababczab
$文字列の末尾ab$zababc
*直前の文字の0回以上の繰り返しab*a ab abbaa ac
+直前の文字の1回以上の繰り返しab+ab abba
?直前の文字の0回または1回ab?a ababb
{m}直前の文字のm回の繰り返しa{2}aaa aaa
{m,n}直前の文字のm回からn回の繰り返しa{1,2}a aaaaa
\特殊文字のエスケープ\..a
[文字の集合]集合の中の1文字[a-c]a b cd
[^文字の集合]集合に含まれない1文字[^a-c]da b c
|いずれかa|ba bc
()グループ化(ab|cd)ab cdabc ac

※ 「任意の一文字」とは、「何でも当てはめて良い一文字」を意味しています。 ※ モードと呼ばれるもので、変わるものもありますが、詳細は省略します。 ※ *+では、なるべく長い文字列とマッチするように探索します。 ※ *?+?とすることで、なるべく短い文字列とマッチするように探索します。 ※ 特殊文字そのものにマッチさせたい場合、r'\[]'のように、バックスラッシュを使います。

角括弧の補足

'[0-9]'は、'[0123456789]'と同じ意味になります。 小文字のアルファベットと数字を表したい場合は、'[a-z0-9]'となります。 '[a-z0-9_]'のように、ハイフン(-)を使う方法と使わない方法を混ぜても大丈夫です。

'[^文字集合]'は、文字集合以外になります。

特殊シーケンス

バックスラッシュで始まる特殊シーケンスもあります。

特殊シーケンス説明同義のパターン
\d任意の数字ASCIIの場合、[0-9]
\D\d以外
\s任意の空白文字ASCIIの場合、[ \t\n\r\f\v]
\S\s以外
\w任意のUnicode単語文字ASCIIの場合、[a-xA-Z0-9_]
\W\w以外
\A文字列の先頭^
\Z文字列の末尾$

※ 特殊シーケンスは、バックスラッシュとアルファベットの2文字です。 ※ ASCII以外のUnicodeでは、「同義のパターン」以外の文字もありえます。

特殊シーケンスの文字列表現は、r'\d''\\d'などがあります。

|で左右のどちらかのサブパターンにマッチさせられます。|はいくつでも使えます。 サブパターンの範囲を示すために括弧を使います。

match

re.match(パターン, 対象文字列)で対象文字列がパターンに先頭からマッチするかを調べます。

re.matchは、対象文字列の先頭からマッチする場合、matchオブジェクト(正規表現の結果をまとめたもの)を返します。マッチしない場合は、Noneを返します。

'.*$'は改行以外の任意の文字列にマッチしますので、'abc'にマッチします。 matchオブジェクトからマッチした文字列を取り出すには、group(0)を使います。

'.+$'は改行以外の任意の1文字以上の文字列にマッチしますので、''にマッチしません。 マッチしたかどうかは、if文でmatchオブジェクトを評価して判断できます。

re.match は、先頭から見ますので、パターンが $ で終わっていれば、全体にマッチするか調べることになります。

グループ

パターンに括弧が含まれていると、括弧内の文字列はグループとして取り出せます。

  • group(0):マッチした文字列全体
  • group(1):1番目のグループ(最初の括弧内)
  • group(2):2番目のグループ(2つ目の括弧内)

ORの補足

r'(ab|cde|\d+)$'というパターンでは、'ab''cde'数字1文字以上のいずれかにマッチします。

ORを使いたいけど、グループは使いたくないというときがあります。 グループにしない括弧を使うことでできます。 '(...)''(?:...)'とするとグループになりません。 たとえば、r'(?:ab|cde|\d+)$'と書きます。

re.split

:または;で文字を区切ります。パターンが固定であれば、str.splitと同じになります。 対象文字列に区切り文字がなければ、対象文字列を要素とするリストが返ります。

re.sub

re.sub(パターン, 置換文字列, 対象文字列)では、置換文字列に以下が使えます。

  • r'\1'group(1)に対応
  • r'\2'group(2)に対応

置換文字列をr'\2 \1'とすると、単語の交換みたいなことができます。

re.sub(r'(\d) (\d)', r'\2 \1', '1 2 3 4')の処理の流れ

  • 最初に、r'(\d) (\d)'は、'1 2 3 4'に対して、'1 2'にマッチし、\1 == '1'\2 == '2'となります。
  • 変換指定が、r'\2 \1'なので、変換後は'2 1'になります。
  • 次に、r'(\d) (\d)'は、'1 2 3 4'に対して、'3 4'にマッチし、\1 == '3'\2 == '4'となります。
  • 変換指定が、r'\2 \1'なので、変換後は'4 3'になります。
  • 最終的に、re.subは、2 1 4 3を返します。

re.findall

複数のパターンを取り出したいときは、re.findallが便利です。

公式ドキュメント

詳しくは 正規表現操作 を参照ください。