Basic Werk | Blog | Contact


MEMOMEM

CommonLisp_CL-PPCRE_01



Common Lisp の正規表現パッケージ CL-PPCRE を使ってみた。

処理系は CLISP



;; quicklisp で "ppcre" を検索 > (ql:system-apropos "ppcre") #<SYSTEM arnesi+.cl-ppcre-extras / arnesi+-20120909-darcs / quicklisp 2013-04-20> #<SYSTEM arnesi.cl-ppcre-extras / arnesi-20101006-darcs / quicklisp 2013-04-20> #<SYSTEM cl-ppcre / cl-ppcre-2.0.4 / quicklisp 2013-04-20> #<SYSTEM cl-ppcre-template / cl-unification-20130128-cvs / quicklisp 2013-04-20> #<SYSTEM cl-ppcre-test / cl-ppcre-2.0.4 / quicklisp 2013-04-20> #<SYSTEM cl-ppcre-unicode / cl-ppcre-2.0.4 / quicklisp 2013-04-20> #<SYSTEM optima.ppcre / optima-20130420-git / quicklisp 2013-04-20> #<SYSTEM parser-combinators-cl-ppcre / cl-parser-combinators-20121125-git / quicklisp 2013-04-20>
;; CL-PPCRE を load > (ql:quickload :cl-ppcre) To load "cl-ppcre": Load 1 ASDF system: cl-ppcre ; Loading "cl-ppcre"
(:CL-PPCRE)
;; Sample 文字列 > (defvar user-agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.28 (KHTML, like Gecko) Chrome/12.0.728.0 Safari/534.28")
;; マッチした部分文字列 > (ppcre:scan-to-strings "M\\S+" user-agent) "Mozilla/5.0" ;
;; グローバルマッチ > (ppcre:all-matches-as-strings "M\\S+" user-agent) ("Mozilla/5.0" "Macintosh;" "Mac" "ML,")
;; こんな関数を作っておくと直感的? (defun m/re/g (re str) (ppcre:all-matches-as-strings re str))
> (m/re/g "\\d+" user-agent) ("5" "0" "10" "6" "6" "534" "28" "12" "0" "728" "0" "534" "28")


まだまだこれから調べる


参考サイト:

CL-PPCRE - Portable Perl-compatible regular expressions for Common Lisp

第4回 Common Lispライブラリガイド

第2回 Quicklispによるライブラリ環境


#CommonLisp #Lisp #regex #CL-PPCRE #Quicklisp #CLISP



SN 2013/07/20 22:55:01

Archives > CommonLisp_CL-PPCRE_01.html





20130621001920_regex_lookbehind_not



例えばあるHTML文書の中に埋め込まれた画像の情報を抜き出したいとします。


画像には jpg, gif, png が複数入り乱れているとしましょう。


この中から「拡張子が gif でない」画像の URL だけ抽出したいとします。

「〜でない」という条件と、それ以外が複数ある場合に便利なのが「否定の先後読み」という正規表現のテクニックです。



この場合、拡張子は URL の最後に付きますので、一旦 URL 全体を正規表現に飲み込ませて、飲み込んだ文字列のケツがどうなってるか後から確認させますので、「否定の後読み」を使います。

また、正規表現には方言や制限がたくさんありますが、最も自由度の高い正規表現エンジンは Perl に組み込まれたものです。


Perl で「拡張子が gif でない」画像の URL だけ抽出する処理をワンライナーで書くと次のようになります。



$ perl -wnl -e 'print $1 if m/<img src="([^"]+(?<!\.gif))"[^>]*>/imsg' file


(?<!\.gif) この部分が否定の後読み (?<!…) になっています。

[^"]+ でダブルクォーテーション内の文字列 = URL を飲み込んだ後、ちょっと後戻りして拡張子が gif でない、つまりそれ以外の jpg や png にマッチするかどうかを確かめています。


マッチすると "([^"]+(?<!\.gif))" のようにダブルクォーテーションの内側が括弧でくくられているので、正規表現エンジンによって組み込み変数である $1 にキャプチャされ、最後に Perl によって print されます。


#Regex #Perl #HTML



SN 2013/06/26 23:20:34

Archives > 20130621001920_regex_lookbehind_not.html