Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

超絶簡単 Pythonでの正規表現

概要

Pythonでの正規表現の使い方についてまとめます。

r'a'表記

raw string表記を示します。余分な\を省くことが可能です。
例えば改行はr'\n'とすれば正規表現として扱うことが出来ます。

メソッド

メソッド 役割
match 正規表現が文字列の先頭と一致するかチェック
search 正規表現による文字列を走査
split 正規表現に一致するもので配列に分離
sub 正規表現による置換
subn subと同じだが、個数を制限可能

matchとsearch

※matchとsearchでは役割が異なるので注意が必要です。
matchは先頭との一致、searchは最後まで走査を行います。
searchとmatchにより一致したMatchObjectの属性は次のものになります。

属性 内容
group 一致した文字列の取得
start 一致した文字列の開始位置
end 一致した文字列の終了位置
span 一致した文字列の開始、終了位置の組

サンプルコードを以下に挙げておきます。group(1)とすることで後方参照が可能です。

#! /usr/bin/env python
# -*- coding:utf-8 -*-
import re
print re.match( r'o', 'google vs yahoo' )  #None
print re.search( r'oo', 'google vs yahoo' ).group()  #oo
print re.match( r'go', 'google vs yahoo' ).start()  # 0
print re.search( r'google', 'google vs yahoo' ).end() #6
print re.search( r'(([a-z]+)\svs\s([a-z]+))', 'google vs yahoo' ).group(1) #google vs yahoo
print re.search( r'(([a-z]+)\svs\s([a-z]+))', 'google vs yahoo' ).group(2) #google
print re.search( r'(([a-z]+)\svs\s([a-z]+))', 'google vs yahoo' ).group(3) #yahoo
print re.search( r'([a-z]+\svs\s[a-z]+)', 'google vs yahoo' ).span() #(0, 15)

分離

splitメソッドにより正規表現での文字列の分離になります。

#! /usr/bin/env python
# -*- coding:utf-8 -*-
import re
data = re.split( r',', 'google,yahoo,gree,mixi' )
for i in data:
    print i 
#出力結果
'''
google
yahoo
gree
mixi
'''

置換

正規表現と後方参照を用いて置換を行います。
sub関数の第一引数でグループ化した正規表現が、第二引数の内部で\1などのような形式で後方参照することが出来ます。

#! /usr/bin/env python
# -*- coding:utf-8 -*-

import re
print re.sub( r'(http.*:google.)(com)', r'\1co.jp', 'http://www.google.com' )
#出力結果
#http://www.google.com

コンパイル

正規表現コンパイルすることが出来ます。コンパイルすることによって後で記述するフラグを利用することが可能です。もしかしたら速度的にも速いかもしれません。
re.comple( 正規表現 ).search()などの法則での記述です。

#! /usr/bin/env python
# -*- coding:utf-8 -*-

import re
print re.compile( 'o' ).match( 'google vs yahoo' )
print re.compile( 'o' ).search( 'google vs yahoo' ).group()

コンパイル時には以下のフラグを設定出来ます。

フラグ 説明
DOTALL, S .が改行も含めて全てのマッチングとさせる
IGNORECASE, I 大小文字区別無し
LOCALE, L ロケールを考慮したマッチング
MULTILINE, M 複数行にマッチング
VERBOSE, X 冗長な正規表現

以下は例で、IGNORECASEを利用した場合になります。

#! /usr/bin/env python
# -*- coding:utf-8 -*-
import re
print re.compile( 'google', re.I ).search( 'GOOGLE' ).group()
#出力結果
#GOOGLE