2013年6月23日日曜日

Pythonで正規表現の勉強をしてみる。 その1

Pythonで正規表現の勉強をしてみる。
会社なんかでもたまに決まったパターンの文字列から数値を取り出してきたりしたいのでちょっと勉強する。
とにかくどこを読んでもパッとしないのでここに手っ取り早く拾得できて復習にもなるようにまとめとこ。

公式ドキュメントのチュートリアルっぽいものを読みながら、

日本語訳もあるようだ。


Introduction
  • 実用上あまり重要でなさそう。
  • reではPerl-styleの正規表現を採用している。
  • 正規表現は一種の言語でありreモジュールを通してそれを使う。
  • マッチングエンジンはCで書かれている。
  • 複雑になりすぎるときは処理が遅くなるかもしれんけど、Pythonで書いたほうがわかりやすいよお。
みたいなことが描いてあった。
正規表現の実力がどんなものか全然わからんので、Pythonでゴリゴリ書くのは保留。

このあと、どうも文章が長くて、面倒なので動くサンプルコードを書く。

import re

p = re.compile(r"[a-z]+")
m = p.match("this1234was")
if m:
    print "matched"
else:
    print "nothing matched"


pに正規表現オブジェクトを作成。コンパイルするときにパターンを教える。
ちなみに、文字列のまえにはr (raw string)をつけておくと\の問題を回避できる。

パターンについては検索するといろいろ出てくるが、今回は[a-z]+(aからzの文字列が1回以上出現)というパターン。

mにはpの動作結果が入る。ここではmatch()を行った。match()の他にsearch(), findall(), finditer()があるようだ。
match()は文字列の先頭から正規表現とマッチするか判定するようなので今回は"this"に相当する部分が検出され、MatchObjectとして返される。検出されない場合はNoneが帰ってくる。
検出された部分を取り出すにはメソッドを使って

print m.group()
print m.start()
print m.end()
print m.span()

finditer()はすべてのマッチした部分をMatchObjectシーケンスのイタレータとして返してくれるので一番使えそうだ。

なお、reのモジュールレベルの関数として
print re.search(r"[a-z]+", "1234abc1234def").span()

と呼び出してもいいようだ。










0 件のコメント:

コメントを投稿