rcmdnk's blog

入門 Python 3

今更ながらPythonでのstrのメソッド、rstripを間違った 方法で使っていたのに気づいたという話。

str.rstrip()

rstripは引数無しで使うと文字列の最後の空白を取り除いてくれます。

>>> x = " xxx "
>>> print "X" + x.rstrip() + "X"
X xxxX

こんな感じ。 引数には文字列を入れてあげることが出来て、

>>> x = "abcdefg"
>>> print x.rstrip("efg")
abcd

こんな感じで最後の方から見て与えた文字があれば消します。

が、ここで注意なのは、ここではefgという文字列を消してるわけではなく、 abcdefgという文字列の最後の文字から順に efgのいずれかに当たる文字を探し、 もし該当すれば削除、しなければそこで作業終了、と言う事を行っています。

実際、

>>> x = "abcdefg"
>>> print x.rstrip("fge")
abcd

と、引数の文字列の順番を変えても同じ結果になります。

余計な文字を加えても、

>>> x = "abcdefg"
>>> print x.rstrip("zfge")
abcd

と同じ結果。

なので、例えばファイルの拡張子名なんかを消そうと、

name = filename.rstrip(".py")

とかすると、example.pyみたいな場合はexampleが得られて良いのですが、 pとかyが最後に来るような ap.pyみたいなファイル名だとaという名前が得られる事になります。

こういった場合にはreplaceを使って

name = filename.replace(".py", "")

等とした方が正しいです。

この場合は拡張子で、ファイル名の中に.pyなど、少なくとも.が 入る様な事は無いだろう、ということでこれでも良いのですが、 replaceだと文字列中どこでも変更してしまうので、 きちんとやるには

import re
name = re.sub("\.py$", "", filename);

みたいな感じでreを使って正規表現できちんと末尾から取るようにする必要が あります。

まとめ

上ではrstripについて書いてますが、これは文字列の最初の方から削除する lstripや両側から削除するstripにも同じ事がいえます。

自分の書いたコードをつらつらと見ていたら、 文字列から空白やクォート等、記号的な余計な物を削除しようとするところでは 正しく

y = x.strip('"\' ')

みたいな事をやってたりして理解してた感がありますし、 これを見たらそう言えばそうだったな、と思ったりもしました。

一方、拡張子を消す、的な所で上の様なrstripをしてしまってる所が 結構ありました。。。

かなり初歩的な所でかつ結構使う機会も多いものなんですが ひどいものです。。。

Sponsored Links
Sponsored Links

« Homebrewのパッケージ情報をJSONで取得(Brew-fileのアップデート) Git.ioを使ってGitHub関連のURLを短縮する »

}