トップ(最新) | <前

nDiki : 正規表現

正規表現 - regular expression

関連情報

ライブラリ

  • PCRE
  • 鬼車
    • 正規表現オブジェクトごとに異なる文字エンコーディングできる。

その他

  • POSIX
  • 有限オートマトン
  • 正則言語

スポンサード リンク

Related term

2005年10月1日 (土)

mixipressコミュニティ掲示板もチェック このエントリーを含むはてなブックマーク

この週末 mixi で遊びのついでに mixipress も試してみることにした。

mixipressPerlで書かれたCGI プログラムで、アクセスするとmixi にログインして「最新のマイミクシィ日記・参加しているコミュニティのBBSへの投稿・以前コメントした日記日記へのコメント・メッセージ・足あとのダイジェスト」を含むRSSを返してくれる。

ローカルの Apachemixipress 0.31 をインストール。 0.31 が出た後、 mixi 側で URL の変更があったのでそれに対応するように一部正規表現を修正。

Sage でアクセス。 ふむふむ、これだと面倒で見ていなかった掲示板のチェックも楽だ。

スポンサード リンク


[ 10月1日全て ]

2005年12月2日 (金)

ほぼ Perl 手帳 このエントリーを含むはてなブックマーク

naney:69347486

ほぼ日手帳のカバー・オン・カバーにProgramming Perlのカバーをはさんでみた。

縦 16.5cm に調整してプリントアウトしたもの。解像度はあまり高くないのだが、ぱっと見はいい感じ。

@ この手帳についていないもの:

東京地下鉄路線図、世界通貨一覧表、時刻表東北新幹線時刻表、世界地図、演算子優先順位表、正規表現書き方標準 Perl ライブラリ一覧、おしゃれ小鉢、などなど、


[ 12月2日全て ]

2006年2月21日 (火)

[ WiKicker ] コメントをパターンでチェック このエントリーを含むはてなブックマーク

WiKicker では書き込み禁止パターン指定機能をつけてあって、特定の文字列または正規表現にマッチしたページデータを保存しても無視されるようになっている。

spam 対策の機能なのだが、実装してからも spam は止まない。 ブラックリスト方式はまあいたちごっこではあるが、それにしても正規表現にマッチしているはずのものまで書き込まれている。あれ?

まてよ、たしかコメントフォームからの追記はそういえばチェックしていなかったような(いや実はかなり前から薄々気がついていたのだが、ついついその場は手作業で SPAM を削除して済ましてしまっていたのだ)。

しかしやっぱり面倒だし、コメント書き込みもチェックしないと片手落ちだなと思い実装。 といってもまあ変更してみると、10数行程度だったりするのだが。

むしろ、テストコードの追加の方がよっぽど多かったり。


[ 2月21日全て ]

2006年6月5日 (月)

第6回 社内 Perl 勉強会 このエントリーを含むはてなブックマーク

リャマ本を使用した社内 Perl 勉強会の6回目を開催。 今日は7人。

今日は「初めてのPerl 第3版」第7章「正規表現の基本」が範囲。

今回は5問のうち最初の3問は正規表現によるパターンを考える形式。

@ 今回の反省点

正規表現というと、Perl 初心者がひっかかる一つの鬼門である(少なくとも私のまわりでは正規表現でビビる人が多かった)。 それを承知の上かリャマ本では章を分けて簡単なところから少しづつ取り組むようになっていて、アレルギー反応がおこりにくいようになっている感じだ。

実際、今回の勉強会でも特につまづいている人はいなかったようだ。

今回は追加ネタとして、正規表現と正則言語と有限オートマトンの話をちょっとだけしたのだけれど、反応はあまり良くなかった。

本当はこういう基礎的な部分に興味を持ってもらうと、深みのある(?)プログラムが書けるのだけれどなかなかそこまではいかないかな。

社内勉強会としては、追加ネタは実用的な方が良いのかもしれない。

今回は1時間5分。


[ 6月5日全て ]

2006年6月12日 (月)

第7回 社内 Perl 勉強会 このエントリーを含むはてなブックマーク

リャマ本を使用した社内 Perl 勉強会の7回目を開催。今日は6人。

今日は「初めてのPerl 第3版」第8章「正規表現の詳細」が範囲。

今回はプログラムを書く問題は無くて、パターンを考えたり逆に与えられたたパターンが何にマッチするのかを考える問題。 「本書の中で最も難易度が高くなっています」と書かれている。

@ 今回の反省点

さすがに今回は正答率が低かった。 問題の意図が読み取りにくいというのもあって、迷う問題も多かったようだ。 プログラミング言語のトークン関連のネタなどはプログラミング経験がある程度ないとぱっとわからないかもしれない。

時間の関係で自分もあまり準備ができなくて、不完全な解答だったのが悔まれる。

今日は追加ネタなしで、トータル50分。


[ 6月12日全て ]

2006年6月30日 (金)

第8回 社内 Perl 勉強会 このエントリーを含むはてなブックマーク

リャマ本を使用した社内 Perl 勉強会の8回目を開催。今日は5人。

今日は「初めてのPerl 第3版」第9章「正規表現の利用方法」が範囲。

展示会などがあった関係で、6月19日以来しばらく間が空いての開催。

@ 今回の反省点

ぱっと見、面白そうな練習問題に見えたがやってみると意外とあっさり風味であった。

最後の問題は、文字列の出現回数を数えるという Perl ではイディオム的なコードを欠く問題。

ハッシュを使うのが定番だが、配列に入れてソートし前から反復する(sort | uniq -c 的な)コードを書いている人が2人いて興味深かった。 たしかに C などだったらそういうコードを書いてたかもしれないな。

今回で8回目を終了。

練習問題にもう少しチャレンジャブルな問題があった方がいいなと思う今日この頃。


[ 6月30日全て ]

2006年7月8日 (土)

Perl v5.8.8CGI.pmPATH_INFO 処理の問題にぶつかる このエントリーを含むはてなブックマーク

手元の WiKicker (や DiKicker) で、「C++」という文字列を含む URI にアクセスしたらエラー

 Nested quantifiers in regex; marked by <-- HERE in m//C++ <-- HERE .html$/ at (eval 27) line 7.

正規表現の一部として使う時には \Q...\E していたと思ったが抜けがあったか。 とコードをチェックしてみたが、それっぽいところなし。 そもそも、Perl 5.005_03 だと問題おきていないし。

確認したら CGI.pm の url() の中でのエラーだった。 quotemeta されていない。

Perl v5.8.8 に含まれている CGI.pm 3.15 で問題を確認。3.17 までは駄目で、3.19 以降だと \Q...\E するように修正されている (3.18 は CPAN にないので不明)。

標準 Perl ライブラリバグを踏んだか……。 標準 Perl ライブラリのアップグレードはなにかと面倒なので、システム要件にはしたくはないんだよねぇ。


[ 7月8日全て ]

2006年7月28日 (金)

PerlCR/LF/CRLF 全対応の1行毎読み込み処理 このエントリーを含むはてなブックマーク

Perl プログラムでテキストファイル処理を 改行コード CR/LF/CRLF 全対応にしようと思ったが、書こうとするとこれが結構面倒臭いことに気がつく。

$/ に正規表現が設定できないため、<FILEHANDLE> で単純に3パターン対応ができない (LFCRLF に対応とかならすぐできる)。

小さいファイルと仮定して良いなら全部読み込んで自前で行分割、大きいファイルならまじめにバッファリングして改行コードをスキャンして行処理するのが正攻法かな。 多少効率悪くなりそうだけれど。

@ Pod::Html (1.0504) の場合

Perl 5.8.8 の Pod::Html (1.0504) だと pod2html の中で $/ = "" と設定して、パラグラフ単位で読み込んでそのあと処理している。

@ PerlIO レイヤー

最近の Perl であれば PerlIO::crlf、 PerlIO::eol あたりが使えそうである。

もちろん Perl 5.005_03 だと NG。


[ 7月28日全て ]

2006年9月11日 (月)

社内 Perl 勉強会 最終回 (第16回) このエントリーを含むはてなブックマーク

リャマ本を使用した社内 Perl 勉強会の16回目を開催。 今日は8人全員。

今日は「初めてのPerl 第3版」第17章「上級テクニック」が範囲。 17章では、「Perl らしい」機能 (Perl 流 eval、grep、 map、スライス)が盛沢山。

@ 今回の反省点

robust なプログラムを書くには Perl では eval 必須の機能なので押さえておきたいところ。 grep、map は何だかんだいって自分が練習問題の解答で使ってしまっているので、他の人もある程度見なれているはず。

練習問題の解答としてはスライスは今回は使用せず。

逆にスカラーコンテキストとリストコンテキストについては、まだ理解が不完全な部分があるようなので解説をしておいた。

@ 最終回を終えて

Perl については

Perl の理解が進んだ (「正規表現」が何か少しわかった、使い方がわかった、知識が増えた)

という一方

Perl の気持ち悪さが理解できた。

という意見があった。

プログラミング言語勉強会としては

他の人の書き方を見ることが参考になった。実際に書くことで覚えた。

等、定期的に練習問題をやってくるというスタイルに対する評価が得られた。

4月21日から始めて5カ月弱。勉強会でスキルアップをはかっていこうという雰囲気ができてきているのはいい傾向だと思う。

今後もテーマを選んで継続していきたい。

次のテーマをより実用重視のものにするか、基礎固めのものにするのかは悩みどころである。


[ 9月11日全て ]

2007年12月29日 (土)

Twitter ベイジアンフィルタプロキシ このエントリーを含むはてなブックマーク

Twitter で following が増えてくるにつれて、タイムラインに目を通すのが大変になってきた(という程きちんと見ている訳ではないが)。 さっとタイムラインをなめて面白そうな情報をピックアップしたい時は、「おはよう」とか「風呂入った」とか「トイレ」とかは除外して読みたい(そういう書き込み自体は嫌いじゃないのだが、人生はあまりにも短い)。

Twit や P3:PeraPeraPrv では NG ワード指定ができて、それらを含むステータスは表示しないようにできるのだが、Twitter の書き込みは揺らぎが激しすぎて指定しきれないという弱点がる。

ということでベイジアンフィルタでフィルタリングしてみることにした。

自前で Twitter クライアントを作る気はないので、proxy の形でさっと実装してみた。

 #!/usr/bin/perl

 use strict;
 use warnings;

 use HTTP::Proxy;
 use HTTP::Proxy::BodyFilter::complete;

 my $proxy = HTTP::Proxy->new(port => 8088);
 $proxy->push_filter(response => HTTP::Proxy::BodyFilter::complete->new,
                     mime     => 'application/xml');
 $proxy->push_filter(response => Bsfilter->new,
                     mime     => 'application/xml');
 $proxy->start;

 {

   package Bsfilter;

   use File::Temp qw/tempfile/;
   use XML::XPath;
   use base qw(HTTP::Proxy::BodyFilter);

   sub filter {
     my ($self, $dataref, $message, $protocol, $buffer) = @_;
     return unless defined($$dataref) && $$dataref ne '';
     eval {
       my $xml = XML::XPath->new(xml => $$dataref);
       my @nodes = $xml->findnodes('/statuses/status/text/text()');
       return unless @nodes;
       for my $node (@nodes) {
         my $text = $node->getNodeValue;
         if (is_NG($text)) {
           $node->setNodeValue("[NG] $text");
         }
       }
       $$dataref = qq(<?xml version="1.0" encoding="UTF-8"?>\n);
       $$dataref .= $xml->get_context->toString;
       utf8::encode($$dataref);
     };
     if ($@) {
       warn $@;
     }
   }

   sub will_modify { 1 }

   sub is_NG {
     my ($text) = @_;

     my ($fh, $filename) = tempfile();
     utf8::encode($text);
     print $fh $text;
     close($fh);
     my $result
       = system(
       "bsfilter --homedir ~/.twitter-bsfilter --ignore-header --auto-update $filename"
       );
     unlink($filename);

     return !$result;
   }
 }

@ HTTP proxy の作成

PerlHTTP proxy を作ろうとして真っ先に思い浮かんだのは POE だけれど、ちょっとヘビーなので今回は HTTP::Proxy をチョイス。 もともとフィルタリング HTTP proxy を作ることを念頭に置いた Perl モジュールなので今回の目的にぴったり。

1つはまった点といえば、filter の呼び出しがレスポンス全てを取得してからではなく一部分ずつの呼び出しになるところ。その仕様に気がつくのにちょっと時間がかかってしまった。 例えば XML 形式のレスポンスをフィルタしようとしても、普通に HTTP::Proxy を使うと XML の一部ずつがフィルタに渡されるため、XML のパースがうまくいかない。

これについては HTTP::Proxy::BodyFilter::complete を使うことで、まとめてフィルタに渡せるようになった。

@ レスポンスの処理

Twitter のタイムライン取得については P3:PeraPeraPrvXML 形式で取得しているので、そのタイプのレスポンスをフィルタするようにした。

XML::XPath でステータス部分を抜き出して NG 判定し、NG であれば先頭に [NG] を追加する。 これで Twitter クライアント側で [NG] を NG ワード指定すれば、表示されないようにすることができる。

@ bsfilter による NG 判定

NG 判定は普段メールspam フィルタとして使っている bsfilter を使った。 単純に system 関数で呼び出して結果を取得するだけ。

今回は対象がメールではないので --ignore-header を指定。また自動的に学習するように --auto-update を指定。 それと普段メールのフィルタリングに使っているのとは bsfilterデータベースを別にしたいので、--homedir も指定しておく。

@ NG と非 NG の学習。

NG ワードを twitter-NG.txt に、非 NG ワードを twitter-clean.txt に書いて以下のコマンドを実行。

 bsfilter --add-clean --ignore-header --homedir ~/.twitter-bsfilter twitter-clean.txt
 bsfilter --add-spam --ignore-header --homedir ~/.twitter-bsfilter twitter-NG.txt
 bsfilter --update --homedir ~/.twitter-bsfilter

自分の環境 (Debian GNU/Linux sid)では、UTF-8 で書いておいて問題なかった。

@ フィルタリングしてみる

あとは先の proxy を起動し、P3:PeraPeraPrv でプロキシとして localhost:8088 を指定すれば OK。

タイムラインを取得するたびに bsfilter が動いて NG なステータスには [NG] が挿入される。

@ フィルタリングの精度

これについては、まだまだチューンの必要ありかな。

  • 事前の学習データが少ない。
  • --auto-update していることもあり、最初に NG 判定が多いとそちら側に強化されすぎる。
  • 毎回 bsfilter を呼んでいるため、同じステータスが何度も学習される。

まだ使える精度まで上がってないけれど、教師データを増やせばそれなりにいけるかもしれない。

proxy の枠組ができたので、(@~は抜いてから bsfilter に渡すとか、前後の文脈も含めるとか)いろいろ試して遊べそうではある。 別に bsfilter にこだわらず、正規表現による判定などをしてもよいし。

この辺り P3 は Java で書かれているので、プラグインを書いて拡張できるよう将来になると面白いなと思ってみたり。


[ 12月29日全て ]

Related web page

404 Blog Not Found:perl - 文字列ばらしはsplit //, $strで
5.005_03 対応で正規表現版もいまだに使っている
http://blog.livedoor.jp/dankogai/archives/50958132.html
PCRE - Perl Compatible Regular Expressions
The PCRE library is a set of functions that implement regular expression pattern matching using the same syntax and semantics as Perl&nbsp;5. PCRE has its own native API, as well as a set of wrapper functions that correspond to the POSIX regular expression API. The PCRE library is free, even for building commercial software.
http://www.pcre.org/
Perl正規表現雑技
open(PERL, &#39;&lt; perl.htm&#39;) or die &quot;perl.htm: $!&#92;n&quot;; { local $/ = undef; $html = &lt;PERL&gt;; } close(PERL); while ($html =~ /(&lt;(NOBR|CODE|B|PRE|FONT)&#92;b # ある開始タグから (?:(?!&lt;&#92;/&#92;2&gt;).)* # そのタグが閉じられる前に (?:&lt;&#92;2&gt;|$))/sigx) { # また開始タグor終わり print $1, &quot;&#92;n&quot;; } トップへ XMLタグを加工する &lt;?xml version=&quot;1.0&quot;?&gt; &lt;div class=&quot;memo&quot;&gt; &lt;div class=&quot;author&quot;&gt; &lt;div class=&quot;name&quot;&gt;okabe&amp;l
http://www.din.or.jp/~ohzaki/regex.htm
phpspot - PHPスクリプト/MySQL/掲示板/入門/サンプル/正規表現/レンタルサーバー
http://phpspot.net/php/

■よく検索されるキーワード

torrent(173) expressions(80) 竹内まりや(58) x31(25) ドラマ(23) linux(23) 手帳(21) 壁紙(21) perl(21) windows(20) 動画(19) wiki(17) porter(17) debian(16) 使い方(16) 画像(15) thinkpad(15) 作り方(15) gmail(14) usb(14) 秋葉原(13) ヨドバシ(13) ほぼ日手帳(13) 提案書(12) 活用(12) 竹内(12) 古川小百合(12) 修理(12) ノート(11) 無印(11) ヨドバシカメラ(11) nikon(11) 書き方(10) ダイソー(10) 万年筆(10) 生年月日(10) 大井町(10) ミニ6穴(9) ほぼ日(9) tc-1(9) 冷蔵庫(9) 設定(9) ニコン(9) java(9) mp3(8) 故障(8) 方眼(8) xp(8) 日誌(8) 感想(8) カメラ(8) allinanchor:*.torrent(8) バッグ(8) firefox(7) インストール(7) キーボード(7) mixi(7) 無料(7) リフィル(7) 小林麻耶(7) nikkor(7) ジョイントラック(7) madwifi(7) 原田夏希(7) skype(6) 変更(6) 三条まゆみ(6) ペンケース(6) web(6) emacs(6) home(6) ポーター(6) 2009(6) itunes(6) a6(6) 無印良品(6) デジカメ(6) finepix(6) 無線lan(6) 評判(6)

この日記のはてなブックマーク数 Add to Google RSS

Process Time: 5.391456s / load averages: 0.39, 0.85, 1.09
nDiki by WATANABE Yoshimasa (profile)
Powered by DiKicker
Base theme by Nana (for tDiary)