<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 ドキュメント
正規表現教えてくれるところ。