読者です 読者をやめる 読者になる 読者になる

As rookie

ルーキーインフラエンジニアがインフラのこと以外も結構書いてしまうブログ

pythonでスライシングを使ってHTMLを生成(力技)

python

こんにちは

前々回でスライシングを身につけました

mokicks.hatenablog.com

今回も文字列関係です(先に進めない)

今回はトリプルクォーテーションと特殊文字について書きます。

トリプルクウォーテーション

"""で文字列を囲むことで複数行に跨いだ文字列をひとまとまりにして扱うことができます

>>> """ one line #複数行文字列開始
... two line
... three line
... """ #複数行文字列終わり
' one line\ntwo line\nthree line\n'

"""で囲い複数行で書いたときに改行は\n として文字列にはいります。\n特殊文字の改行を表します

特殊文字

文字列内で\を記号を使って改行などの特殊な文字列を表現することができます。 上記の複数行の代入を例にすると

>>> tmp = """one line #tmpに複数行の文字列を代入
... two line
... three line"""
>>> print tmp
one line
two line
three line

このような感じで\n が入っていたものをprintすると改行されていることがわかります。

今回は\n で改行。\t でタブということだけ書いておきます

www.pythonweb.jp

ここでまとめてくれていますので、参考にさせてもらいましょう。

本題

この二つのことと前回のスライシングでHTMLを生成したいと思います。

方法は

htmlタグを代入した文字列オブジェクトとspanタグを代入した文字列オブジェクトを用意しfindメソッドとスライシングでHTMLを生成する

>>> html = """<html>
... </html>"""
>>> print html
<html>
</html>

>>> span = "\t<spna></span>\n"
>>> print span
    <spna></span>

>>> html.find("\n")
6
>>> print html[:html.find("\n")] #htmlの改行文字までを表示
<html>

>>> print html[:html.find("\n")] + span #改行文字が出力されていない。 
<html>    <spna></span>

>>> print html[:html.find("\n")] + span + html[html.find("\n")+1:] #やっぱり改行文字が表示されていない。
<html>    <span></span>
</html>

>>> print html[:html.find("\n")+1] + span + html[html.find("\n")+1:] #1足す。いい感じになる
<html>
    <span></span>
</html>

>>> print html[:html.find("\n")+1] + span[:span.find(">")] + "torick" + span[span.find(">"):] + html[html.find("\n")+1:] #findで検索した文字の一つ前になるからミス
<html>
    <spantorick></span>
</html>
>>> print html[:html.find("\n")+1] + span[:span.find(">")+1] + "torick" + span[span.find(">")+1:] + html[html.find("\n")+1:] #成功
<html>
    <span>torick</span>
</html>

こんな感じで力技でHTMLを書くことができました!

最初にhtml.find()をして6が返ってきてますね

< h t m l > \n
0 1 2 3 4 5 6

なのでスライシングで html[:6]としてなぜ出ないのか謎でした。そこでちょっと試してみた。

>>> html.find("<")
0
>>> html.find("h")
1
>>> html.find("t")
2
>>> html.find("m")
3
>>> html.find("l")
4
>>> html.find(">")
5
>>> html.find("\n")
6
>>> print html[:html.find("\n")] #6文字目までを指定
<html> #改行は表示されない
>>> print html[:html.find("\n")+1] #1足す
<html> #改行は表示されている

>>> print html[:6] #数字で指定
<html> #やはり改行は表示されていない

スライシングの認識が間違っているのかもしれない。

スライシングで指定する[0:6]この場合の6は要素番号じゃなくて「6番目の文字」という認識なら[:6]で改行文字が指定ができないことを納得できる

< h t m l > \n
0 1 2 3 4 5 6 #要素番号
< h t m l > \n
1 2 3 4 5 6 7 #個数

別の方法で試してみる

>>> tmp = "abcdefg"
>>> tmp[5]
'f' #要素番号5番目のfが帰ってくる
>>> tmp[:5] 
'abcde' #5個目の文字まで返ってくる

>>> tmp[5:]
'fg' #5個目の要素から最後までが返ってくる

スライシングの始まり[こっちがわ:]は要素番号

スライシングの終わり[:こっち側]は先頭から何文字目(個数)がいれられる

という認識になりました

>>> tmp[3:3]
''
>>> tmp[3:4]
'd'

スライシングで数字で「どこまで」を指定する場合は「何個目まで」というので抽出しているのでしょう。

以上。HTMLを力技で生成でした