おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

Python初心者のお勉強ノート(8)正規表現入門

文字列の中から特定のパターンを探したり、置き換えたりする場合に正規表現(regular expression)が役立ちます。Pythonではreモジュールを使って正規表現を扱います。

reモジュールとは?

Pythonのreモジュールは正規表現を使った文字列処理をサポートする標準モジュールです。このモジュールをインポートすることで、正規表現に関連するさまざまな関数を利用できます。

import re

正規表現リテラル

正規表現では、特別な記号やパターンを使って条件を表現します。これを「正規表現リテラル」と呼びます。Pythonでは文字列の先頭にrを付けた「raw文字列」を使うと便利です。例えばr"\d+"と書くと、そのまま正規表現として扱えます。後で詳しく説明しますが、\dは任意の数字、+はその前の文字の1回以上の繰り返しを意味します。この正規表現パターンには"1234"や"567890"がマッチします。

pattern = r"\d+"  # 数字の1回以上の繰り返し

正規表現の基本操作

パターンにマッチするか確認する

match関数を使うと、文字列の先頭が特定のパターンに一致するかを確認できます。

s = "Hello world."
pattern = r"Hello"

if re.match(pattern, s):
    print("先頭に'Hello'があります")
else:
    print("先頭に'Hello'はありません")

文字列中の全ての一致箇所を探す

findall関数は、文字列中のすべてのマッチ箇所をリストとして返します。

s = "apple, orange, banana, apple"
pattern = r"apple"

matches = re.findall(pattern, s)
print(matches)  # ['apple', 'apple']

パターンに一致する部分を置き換える

sub関数を使うと、指定したパターンに一致する部分を別の文字列に置き換えられます。

s = "I like apples and bananas."
pattern = r"apples"
new_string = re.sub(pattern, "oranges", s)
print(new_string)  # I like oranges and bananas.

よく使う正規表現の構文と例

文字クラス [ ]

角括弧[ ]内に指定した文字のいずれか1つにマッチします。

pattern = r"[aeiou]"  # 母音にマッチ
s = "banana"
print(re.findall(pattern, s))  # ['a', 'a', 'a']

任意の1文字 .

ピリオド.は任意の1文字にマッチします。

pattern = r"a.c"
s = "abc, aac, acc"
print(re.findall(pattern, s))  # ['abc', 'aac', 'acc']

繰り返し *, +, ?

  • *: 直前の文字の0回以上の繰り返し
  • +: 直前の文字の1回以上の繰り返し
  • ?: 直前の文字の0回または1回
pattern = r"ba*"
s = "b, ba, baa"
print(re.findall(pattern, s))  # ['b', 'ba', 'baa']

pattern = r"ba+"
print(re.findall(pattern, s))  # ['ba', 'baa']

pattern = r"ba?"
print(re.findall(pattern, s))  # ['b', 'ba', 'ba']

特定の位置にマッチする ^$

  • ^: 文字列の先頭にマッチ
  • $: 文字列の末尾にマッチ
pattern = r"^Hello"
s = "Hello world."
print(bool(re.match(pattern, s)))  # True

pattern = r"world\.$"
print(bool(re.search(pattern, s)))  # True

なお、最後の正規表現リテラルで、ピリオドの前にバックスラッシュがありました。 このバックスラッシュは直後の文字の特別な意味を無くし、その文字そのものにします。 なぜなら、バックスラッシュがないと、ピリオドは「0個以上の前の文字の繰り返し」になってしまいます。 ここでは、ピリオドそのものを意味するために、バックスラッシュを使っています。

数字や英字を表す\d\w

  • \d: 数字にマッチ
  • \w: 英数字とアンダースコアにマッチ
pattern = r"\d+"
s = "123 apples"
print(re.findall(pattern, s))  # ['123']

pattern = r"\w+"
s = "Hello_world"
print(re.findall(pattern, s))  # ['Hello_world']

正規表現用語の解説

  • 文字クラス: [ ]の中に指定した文字をグループ化し、そのいずれかにマッチします。
  • 量指定子: *, +, ?など、繰り返しの回数を指定する記号です。
  • エスケープシーケンス: \d\wのように、特定の文字やパターンを短縮して表現するものです。

注意点と参考となるウェブサイト

正規表現は強力ですが、複雑になるとコードが読みにくくなります。まずは基本をしっかり理解し、簡単な場面で使うことから始めましょう。

参考となるウェブサイトを示しておきます。