文字列の中から特定のパターンを探したり、置き換えたりする場合に正規表現(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
のように、特定の文字やパターンを短縮して表現するものです。
注意点と参考となるウェブサイト
正規表現は強力ですが、複雑になるとコードが読みにくくなります。まずは基本をしっかり理解し、簡単な場面で使うことから始めましょう。
参考となるウェブサイトを示しておきます。