<Python, regexp> 例題, アパッチログからのテキストの抽出

Webサーフィン中に正規表現regexpの例題を見つけたので分析。 たまに練習しないと難しくて理解できん。。。

In [1]: s = '127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326'

In [2]: s
Out[2]: '127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326'

In [3]: import re

In [4]: r = re.sub(r'^(\S+) (\S+) (\S+) \[([^\]]+)\] "([A-Z]+) ([^ "]+)? HTTP/[0-9.]+" ([0-9]{3}) ([0-9]+|-)', r'\1,\2,\3,\4,\5,\6,\7,\8', s)

In [5]: r
Out[5]: '127.0.0.1,-,frank,10/Oct/2000:13:55:36 -0700,GET,/apache_pb.gif,200,2326'

で、分析。
\S --> 任意の非空白文字にマッチします。空白文字の場合は \s
+ --> 直前の文字に1回以上繰り返しでマッチ。
(.) --> ()で挟まれた部分にマッチしたものをメモリ。
        あとで\1で呼び出せる。
[.] --> []の中のどれかの文字にマッチ。
        [0-9]なら0~9のどれか。
{.} --> 直前の文字に{}内の数字回マッチ。
         {3}なら3回マッチ。
[^.] --> []内の^は否定、続く文字にマッチしない。
         [^1]なら1以外にマッチ。
| --> どっちか。
? --> 直前の文字に0回以上マッチ。

これと匹敵する、チョー簡単ケースは、

In [34]: s
Out[34]: '127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326'

In [35]: r = re.sub(r'^(.+) (.+) (.+) \[(.+)\] "(.+) (.+)? HTTP/.+" (.{3}) (.*)', r'\1,\2,\3,\4,\5,\6,\7,\8', s)

In [36]: r
Out[36]: '127.0.0.1,-,frank,10/Oct/2000:13:55:36 -0700,GET,/apache_pb.gif,200,2326'

Pythonマニュアル。

6.2. re — 正規表現操作 — Python 3.4.3 ドキュメント

正規表現教えてくれるところ。

www.kent-web.com