正規表現
pythonで正規表現を使うにはreモジュールを使って正規表現をオブジェクト型に
コンパイルしてマッチさせることができるようになるみたい。
基本的な例で"day"という文字列が"today"という文字列にマッチするかを
確かめるなら文字列を走査して正規表現がマッチする位置を探す
searchメソッドを使って、
import re p = re.compile("day") str = "today" p.search(str)
とすると
<_sre.SRE_Match object at 0x014148A8>
というマッチオブジェクトが返ってくる。
つまりマッチするということ。
必ずしも正規表現をコンパイルする必要は無いようで、reモジュールはmatch,search,subなどのトップレベルの関数
も提供しているようなので、上の例は
import re re.search("day", "today")
のようにできて、
<_sre.SRE_Match object at 0x01414988>
というマッチオブジェクトが返ってくる。
マッチした文字列を置換するならsubメソッドを使えばよいみたいで、
p = re.compile("pen") str = "This is a pen." substr = p.sub("pencil", str) print substr
とすれば
This is a pencil.
と表示される。
これもトップレベルの関数を使うなら、
substr = re.sub("pen", "pencil", "This is a pen.") print substr
のように書けば、同じ結果が得られた。
コンパイルしたパターンにマッチする文字列を探し出すには
findallメソッドを使えて、結果として返ってくるのは文字列のリストみたい。
p = re.compile("day") p.findall("today")
のように試してみると、
['day']と表示される。
これも
re.findall("day", "today")
で同じ結果が得られた。
この他splitメソッドはマッチする場所がある度に文字列を分割するようなので、
p = re.compile("day") p.split("today, Monday")
のように試してみると、
['to', ', Mon', '']と表示される。
re.split("day", "today, Monday")
でやはり同じ結果が得られた。
マッチオブジェクトからマッチに関するいろいろな情報をメソッドを使って
得ることができるみたい。
groupメソッドはマッチした文字列を、startメソッドはマッチした文字列の開始位置を、
endメソッドはマッチした文字列の終了位置を返すみたい。
spanメソッドはstartメソッドとendメソッドの結果をタプルで返してくるようなので
試してみると、
>>> str = "Thank you for telling me about your recent situation." >>> import re >>> p = re.compile("recent") >>> m = p.search(str) >>> m.group() 'recent' >>> m.start() 36 >>> m.end() 42 >>> m.span() (36, 42)
のようになる。