Python3での正規表現(re)

はじめに

Python3での正規表現の使い方についてまとめます.
手っ取り早く確認したい方は,リファレンスを用意していますのでそちらをご覧ください.

リファレンス

記号 意味
? 直前の正規表現にマッチするものがあってもなくてもよい
* 直前の正規表現にマッチするものが0回以上
+ 直前の正規表現にマッチするものが1回以上
^ 開始記号
$ 終了記号
. ワイルドカード
\d 数字にマッチ
\s スペースにマッチ
\w 文字にマッチ
() グルーピング
| または
[] []内の任意の1文字とマッチ
[^] []内の任意の1文字とマッチしない
{l,u} 直前の正規表現にマッチするものがl回以上u回以下

基本的な使い方

インポート

>>> import re

正規表現オブジェクトの生成

まず,正規表現オブジェクトを生成します.
以下は,文字列Helloとマッチする正規表現オブジェクトです.

>>> regexp = re.compile(r"Hello")

文字列とのマッチング

findallメソッドを用いることで,引数に設定された文字列の中から,正規表現にマッチするものを全て抽出できます.

>>> match_list = regexp.findall("Hallo Hello Hollo Hello Helle")

結果の出力

結果を出力します.

>>> print(match_list)
['Hello', 'Hello']

さまざまな例

電話番号の検索

>>> regexp = re.compile(r"\d{3}-\d{4}-\d{4}")
>>> match_list = regexp.findall("Alice:090-0000-0000, Bob:080-1111-1111")
>>> print(match_list)
['090-0000-0000', '080-1111-1111']

母音の抽出

>>> regexp = re.compile(r"[あいうえお]")
>>> match_list = regexp.findall("おはよう,いかがですか,さようなら.")
>>> print(match_list)
['お', 'う', 'い', 'う']

名前欄の抽出(グルーピング有)

>>> regexp = re.compile(r"Name: (.*),")
>>> match_group = regexp.search("Country: Japan, Name: Szarny, Blog: hatena")
>>> print(match_group.group())
Name: Szarny,
>>> print(match_group.group(1))
Szarny

フォーマットチェック

>>> def format_checker(text):
...     # 英数字のみならOK
...     if re.compile(r"^[0-9a-zA-Z]+$").search(text) == None:
...         print("Invalid!")
...     else:
...         print("Valid!")
...
>>> format_checker("hello")
Valid!
>>> format_checker("password123")
Valid!
>>> format_checker("!password123#")
Invalid!
>>> format_checker("")
Invalid!
>>> format_checker("He#llo")
Invalid!

氏名の隠蔽(subメソッド)

>>> regexp = re.compile(r"Mr.(\w)\w*|Mrs.(\w)\w*")
>>> regexp.sub(r"\1\2xxxx", "Mr.Bob gave Mrs.Alice a book of Mr.Jack")
'Bxxxx gave Axxxx a book of Jxxxx'

おわりに

Pythonでの正規表現(re)の利用方法についてまとめました.

もし,正規表現が複雑になって良く分からなくなれば,こちらのサイトが便利です.
正規表現を可視化してくれます.
regexper.com