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

公開日: : 最終更新日:2020/12/02 Perl , , , ,

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

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

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

Contents

ファイルの読み込み

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 とします。

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

関連記事

記事はありませんでした

【Cubase】イヤホンから音がでないときの対処方法。

Cubase でイヤホンから音がでなくなったときの対処方法のメモです。

【Cubase】特定のトラックを無効にする方法。

今回は、Cubaseで特定のトラックのみを無効にする方法について紹介し

【転移学習】学習済みVGG16 による転移学習を行う方法【PyTorch】

今回は、PyTorch を使って、学習済みのモデル VGG16 を用い

【PyTorch】畳込みニューラルネットワークを構築する方法【CNN】

今回は、PyTorch を使って畳込みニューラルネットワーク(CNN)

【PyTorch】ニューラルネットワークを構築する方法【NN】

今回は、PyTorch を使って、ニューラルネットワーク(NN)を構築

→もっと見る

PAGE TOP ↑