lispとrubyとpythonと その6 正規表現(python)

Pythonでの正規表現

#reモジュールを使う
import re

#正規表現をコンパイル
#r""でrawstringになって\が特別な意味を持たなくなる。
#正規表現を書くときにはこっちを使うと便利
#re.compileの引数で設定変更できる(大文字、小文字区別しないとか)
rx = re.compile(r"(?P<p>.*)://(?P<d>.*)/")

target = "http://faroffsea.blogspot.com/"

rx
#=><_sre.SRE_Pattern object at 0xb7c38020>

#マッチさせる
#matchは対象文字列の先頭にマッチしなければnoneが返る
#マッチしなければnone
#普通の期待する動作はsearchの方だと思う
rx = re.compile("a.")
mo = rx.match("ab")

print(mo)
#-><_sre.SRE_Match object at 0xb7c36e20>

mo = rx.match("bab")
print(mo)
#->None

mo = rx.search("bab")
print(mo)
#-><_sre.SRE_Match object at 0xb7c36720>

mo = rx.match("bab",1)
print(mo)
#-><_sre.SRE_Match object at 0xb7c36e20>


rx = re.compile(r"(?P<p>.*)://(?P<d>.*)/")

target = "http://faroffsea.blogspot.com/"

mo = rx.search(target)

print(mo)
#-><_sre.SRE_Match object at 0xb7c90bf0>

#マッチした文字列の情報を取得
mo.group()
#=>http://faroffsea.blogspot.com/

#マッチした文字列
for i in range(mo.lastindex + 1):
    print(mo.group(i))
#->http://faroffsea.blogspot.com/
#  http
#  faroffsea.blogspot.com

#名前で取得
print(mo.group("p"))
print(mo.group("d"))
#->http
#->faroffsea.blogspot.com

#マッチした文字列が開始する位置
for i in range(mo.lastindex + 1):
    print(mo.start(i))
#->0
#  0
#  7

#マッチした文字列が終了する位置
for i in range(mo.lastindex + 1):
    print(mo.end(i))
#->30
#  4
#  29

#マッチした文字列の開始、終了位置をタプルで返す
for i in range(mo.lastindex + 1):
    print(mo.span(i))
#->(0, 30)
#  (0, 4)
#  (7, 29)

#見つかった文字列をリストにして返す
rx = re.compile("a..")
rx.findall("aaa,abb,acc,add")
#=>['aaa', 'abb', 'acc', 'add']

#イテレータを返す
for e in rx.finditer("aaa,abb,acc,add"):
    print(e.group())
#->aaa
#  abb
#  acc
#  add

#置換
rx = re.compile("a.")
rx.sub("xx","aaa,abb,acc,add")
#=>'xxxxxxb,xxc,xxd'

rx = re.compile(r"(?P<a>a.)")
rx.sub("\g<1>_change","aaa,abb,acc,add")
#=>'aa_changea,_changeab_changeb,ac_changec,ad_changed'

rx.sub("\g<a>_change","aaa,abb,acc,add")
#=>'aa_changea,_changeab_changeb,ac_changec,ad_changed'


#モジュールの関数でも同じことができる
re.search(r"(?P<p>.*)://(?P<d>.*)/","http://faroffsea.blogspot.com/")