
Python + CotEditorでテキスト処理 4
さて、前回を土台にして、もう少し込み入った処理を書いていきます。
前回のコードを、たとえば以下のようなテキストで実行すると、
こんなテキストが得られます。
問題は<p></p>の部分です。ここは空改行にあたるので、このままではうまくいきません(何がうまくいかないかは、のちのちわかります)。ここは、<p><br /></p>になっていて欲しいところです。
ということは、行の中身に合わせて処理を変えたらいいということですね。いよいよプログラミングらしくなってきました。条件分岐です。
Pythonでは、条件分岐を以下のように書きます。
if expression:
suite...
[elif expr:
suite...]
[else:
suite...]
ようするに、if(もし) hogehogeだったら、下のブロックを実行せよ、そうでなく、hogahogadattaraだったら、この下のブロックを実行せよ、それらすべてではないならば、この下のブロックを実行せよ、という感じです。
今回判定したいのは、その行が空改行だったら、ですが、ようするにその文字列の中身が空なら、言い換えれば、長さが0だったら、です。
文字列の長さは、len()で取得できるので、各行の長さは、len(line)で取得できますね。
ということは、以下のようになりそうです。
もし、lineの長さが、ゼロと等しいなら(このように条件を表す式では=を二つ重ねて使います)、<p><br /></p>を、そうでないならその行の中身を<p>と</p>で括ったものをプリントせよ。
では、実際にやってみましょう。
あれ。変わっていませんね。<p><br /></p>ではなく、他の行と同様の処理が行われています。つまり、「 if len(line) == 0:」の部分に何かひっかかるところがあるのでしょう。普通に考えれば、これが0ではないから、elseの方が処理されている。つまり、何かが入っている……
あっ、改行文字。
そういえば、前々回で「line.rstrip():「line」の箱に入っている文字列の末尾部分を除去せよ」という命令を確認したのでした。このrstrip()を使って取り除かなければならない文字が入ってるから、改行が二回重ねられていたのでした。つまり、== 0にはならないので、<p><br /></p>がプリントされない、というわけです。
だったら、 == 1にすればいいのかとも思いますが、普通に1文字が入っている場合はどうなるのでしょうか。そのときは文字列の長さが2になるから、問題ないのかも……
とか思案しなくても、よくよく考えれば、まさにそのrstrip()があるのでした。それで取り除いた結果が0であれば、文句なくテキストは空っぽなはずです。つまり、こうなります。
これを実行してみると、
このように想定通りの出力が得られました。少しパワーアップしましたね。
次回も、同様に改良を加えていきましょう。
(つづく)