見出し画像

Python + CotEditorでテキスト処理 4

さて、前回を土台にして、もう少し込み入った処理を書いていきます。

前回のコードを、たとえば以下のようなテキストで実行すると、

画像1

こんなテキストが得られます。

画像2

問題は<p></p>の部分です。ここは空改行にあたるので、このままではうまくいきません(何がうまくいかないかは、のちのちわかります)。ここは、<p><br /></p>になっていて欲しいところです。

ということは、行の中身に合わせて処理を変えたらいいということですね。いよいよプログラミングらしくなってきました。条件分岐です。

Pythonでは、条件分岐を以下のように書きます。

if expression:
   suite...
[elif expr:
   suite...]
[else:
   suite...]

ようするに、if(もし) hogehogeだったら、下のブロックを実行せよ、そうでなく、hogahogadattaraだったら、この下のブロックを実行せよ、それらすべてではないならば、この下のブロックを実行せよ、という感じです。

今回判定したいのは、その行が空改行だったら、ですが、ようするにその文字列の中身が空なら、言い換えれば、長さが0だったら、です。

文字列の長さは、len()で取得できるので、各行の長さは、len(line)で取得できますね。

ということは、以下のようになりそうです。

画像3

もし、lineの長さが、ゼロと等しいなら(このように条件を表す式では=を二つ重ねて使います)、<p><br /></p>を、そうでないならその行の中身を<p>と</p>で括ったものをプリントせよ。

では、実際にやってみましょう。

画像4

あれ。変わっていませんね。<p><br /></p>ではなく、他の行と同様の処理が行われています。つまり、「 if len(line) == 0:」の部分に何かひっかかるところがあるのでしょう。普通に考えれば、これが0ではないから、elseの方が処理されている。つまり、何かが入っている……

あっ、改行文字。

そういえば、前々回で「line.rstrip():「line」の箱に入っている文字列の末尾部分を除去せよ」という命令を確認したのでした。このrstrip()を使って取り除かなければならない文字が入ってるから、改行が二回重ねられていたのでした。つまり、== 0にはならないので、<p><br /></p>がプリントされない、というわけです。

だったら、 == 1にすればいいのかとも思いますが、普通に1文字が入っている場合はどうなるのでしょうか。そのときは文字列の長さが2になるから、問題ないのかも……

とか思案しなくても、よくよく考えれば、まさにそのrstrip()があるのでした。それで取り除いた結果が0であれば、文句なくテキストは空っぽなはずです。つまり、こうなります。

画像5

これを実行してみると、

画像6

このように想定通りの出力が得られました。少しパワーアップしましたね。

次回も、同様に改良を加えていきましょう。

(つづく)

この記事が気に入ったらサポートをしてみませんか?