【Perl】ファイルを読み込んで正規表現でマッチした部分を別ファイルに出力する方法。

Perl で、ファイルを読み込んで正規表現でマッチした部分を別ファイルに出力するスクリプトを書いたときのメモです。

やりたいことは、以下のような HTML ファイルを読み込んで、囲碁の SGF(棋譜データ)の部分だけを抜き出して出力するスプリクトを作りたい、ということです。

SGF データは、「(;」から「)」の部分になるので、その部分を正規表現で抜き出します。

ファイルの読み込み

open 関数でファイルの読み込みをします。

open:ファイルを開くことに成功したら真 (true)、失敗したら undef を返します。

IN:ファイルハンドル(指定したファイルとのやりとりをする際のコネクション)です。自由に名前を付けれますが、分かりやすく IN とします。

ファイル名の前の「<」: 読み込み専用モードでファイルを開くことを意味しています。

||:左側が真(true)以外だと右側を実行します。この場合は、ファイルの open に失敗したら undef が返るので右側のエラーメッセージが出力されます。

ファイルを一括で読み込む

通常、一行ずつ読み込みして変数に格納していくのですが、今回は、全体をまとめて(改行を無視して)変数に格納します。

これで、$page 変数にファイル全体が格納されます。

正規表現で SGF データ部分を抜き出す

SGF データ ↓

(;
GC[第26回名人戦 挑戦手合第3局(主催 朝日新聞)]PB[依田紀基]BR[名人]PW[林海峰]WR[九段]KM[5.5]DT[2001-9-26,27]RE[W+0.5];B[qd];W[dp];B[cd];W[qp];B[op];W[mp];B[on];W[qn];B[pl];W[gq];B[qm];W[pn];B[om];W[nc];B[pq];W[qq];B[rm];W[rn];B[od];W[pb];B[nd];W[mc];B[kd];W[md];B[me];W[le];B[ld];W[mf];B[ne];W[qc];B[rd];W[lf];B[lb];W[rc];B[oh];W[ie];B[ic];W[mi];B[jf];W[jh];B[if];W[pm];B[ol];W[lm];B[ck];W[ge];B[fc];W[ed];B[ec];W[dd];B[dc];W[ce];B[bd];W[ek];B[di];W[fi];B[hf];W[dh];B[ch];W[cg];B[ci];W[eh];B[cn];W[gd];B[hb];W[id];B[ke];W[dn];B[co];W[do];B[lk];W[mk];B[ml];W[ll];B[mj];W[lj];B[nk];W[kk];B[pd];W[mb];B[li];W[mk];B[ob];W[oc];B[lk];W[kj];B[lq];W[mq];B[mr];W[lp];B[kr];W[kq];B[lr];W[jq];B[mh];W[ql];B[rl];W[ni];B[oi];W[qk];B[rk];W[qg];B[qj];W[ng];B[og];W[nh];B[ih];W[qr];B[nq];W[cp];B[dm];W[dl];B[cl];W[em];B[ij];W[nj];B[pc];W[qb];B[ma];W[oa];B[fg];W[ef];B[bp];W[bq];B[gj];W[bg];B[cm];W[oj];B[pj];W[be];B[jr];W[mk];B[nf];W[hr];B[fl];W[or];B[pr];W[ps];B[nr];W[hm];B[lc];W[nb];B[gm];W[gn];B[el];W[fm];B[gl];W[hl];B[fj];W[sd];B[se];W[sc];B[re];W[ad];B[bb];W[ir];B[bo];W[aq];B[eg];W[dg];B[ff];W[ee];B[bh];W[ae];B[hn];W[go];B[jl];W[hk];B[jk];W[jm];B[ok];W[lh];B[km];W[jn];B[ei];W[fh];B[sn];W[so];B[sm];W[rp];B[ac];W[gc];B[gb];W[cc];B[bc];W[cb];B[db];W[hj];B[hi];W[gk];B[fk];W[gi];B[ej];W[ca];B[da];W[im];B[la];W[na];B[ii];W[kf];B[je];W[jg];B[kl];W[kn];B[po];W[qo];B[mn];W[no];B[oo];W[mm];B[nn];W[ig];B[hg];W[jc];B[jd];W[ah];B[ai];W[ag];B[lo];W[ko];B[mo];W[ji];B[cq];W[cr];B[np];W[kp];B[he];W[hd];B[jb];W[hc];B[ib];W[js];B[ks];W[is];B[ns];W[os];B[nm];W[nl];B[dq];W[eq];B[ml];W[bi];B[bj];W[nl];B[dr];W[er];B[ml];W[jj];B[ik];W[ln];B[ap];W[qs];B[nl])

$page から正規表現で SGF データを抜き出します。SGF は、「(;」から始まり「])」で終わります。

if の中は $page =~ m|マッチさせたい文字列| となります。マッチさせたい文字列を()で囲むとその内容が、$1 に入ります。なので、$page =~ m|(マッチさせたい文字列)| となります。さらに、「m||s」として s をつけると複数行の文字列を単一行であるかのように扱うことができ、「.」で改行文字にもマッチさせることができます。

\(\;.+?\]\) 部分

「()」「[]」「;」を単なる文字として扱うために、「\」記号を付けてエスケープ処理を行います。「.」は (改行以外の) すべての文字にマッチしますが、|s を付けているので、今回は全ての文字にマッチします。「.+」とすると文字が1文字以上を表します(このデータでは必ず1文字以上はあるため)。また、「.+?」とはてなをつけると、最短の範囲でマッチさせることができます。

SGF データをファイルに書き込む

OUT:ファイルハンドル。自由に名前を付けれますが、分かりやすく OUT とします。

ファイル名の前の「>」: 書き込み専用モードでファイルを開くことを意味しています。

関連記事

記事はありませんでした

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

【Python】pip3 で「cannot import name ‘main’」エラーが出たときの対処法。

Python でライブラリをインストールする際に、pipを使います。

【mecab-python3】parseToNode で surface が正しく取得できないときの対処法。

python3 で mecab-python3 を使うと、parseT

【Python】形態素解析器 Mecab を Linux(Ubuntu)で使ってみた。

Linux の Ubuntu OS に、形態素解析器 Mecab をイ

【Python】NLTK(自然言語処理ライブラリ)を使ってみた。

Python の自然言語処理ライブラリである NLTK を Linux

【Python】OpenCV を使って顔画像を検出してみた。

OpenCV のインストール Numpy のインストール [c

→もっと見る

PAGE TOP ↑